Visual Studio Multi-Project Templates
Идея
В одной из прошлых статей я рассказывал уже о том, как создавать шаблоны проектов. Там я рассказывал о нюансах создания шаблонов в VS2008 и VS2010, как настроить данные, файлы и все такое прочее. Это конечно хорошо, но всегда хочется большего.
Если студия может создавать сразу несколько проектов в для одного решения, то значит и мы должны по идее суметь такое же сделать. А уж применений я думаю у нас надется. Можно сразу сделать заготовки для домена, инфраструктуры, сервисов, интерфейса, все это сразу настроить на взаимосвязь и создавать одним щелчком мыши (ну или сколько там надо, чтобы создать один проект).
Итак, будем делать мульти-проектовое (проектное?) решение.
Подгодовка
Шаблоны для заготовки можно сделать вручную, но вероятность ошибки велика, лучше доверим это автоматике. Будем создавать мульти-проект из двух проектов, большее число делается по аналогии и в действительности не представляет проблем.
Мульти-проект будет состоять из WinForms и Dll. В целом абсолютно без разницы какие проекты вы будете использовать. Даже неважно чтобы они были все на одном языке программирования!
Итак, у нас есть 2 проекта в обозревателе решений и начинаем их экспорт как шаблонов. Для этого
1. открываем File > Export Templates
2. Выбираем проект, жмем «Next»
3. Заполняем необходимые поля и жмем «Finish»
После этого откроется папке с архивом, где будет шаблон проекта. Пока оставим все как есть и проделаем шаги 1-3 для всех оставшихся проектов, которые надо будет добавить в мульти-проект.
Создание
Когда у нас будут экспортированы все проекты, открываем папку с ними и разархивируем их. Должно получится примерно как на картинке.
Открываем каждую папку и переименовываем файл MyTemplate.vstemplate во что-нибудь более аутентичное. Хотя в целом этот шаг не обязательный.
Следующим шагом будет создание файла, который скажет студии, что все эти проекты не сами по себе, а команда!
Создаем рядом с папками новый текстовый файл, переименовываем его так, чтобы расширение было vstemplate.
Открываем вновь созданный файл в любом редакторе и пишем следующее
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>WinForms with Dll</Name>
<Description>An example of a multi-project template</Description>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="WinForms">
WinForms\WinForms.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="ClassLib">
ClassLibrary\ClassLibrary.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
В самом начале жирным выделен текст (имя проекта), который будет показываться в студии при создании проекта, по которому вы узнаете что это ваше. Далее идет описание проекта, опционально.
Следующие выделенные пункты говорят о том, где расположены включенные в мульти-проект подпроекты. Я думаю понятно, что если бы у вас было 3 подпроекта, то часть
<ProjectTemplateLink ProjectName="WinForms"> WinForms\WinForms.vstemplate </ProjectTemplateLink>
Надо было бы повторить три раза
После того как файл отредактирован и сохранен, необходимо этот файл и папки добавить в новый zip архив и поместить в папку C:\%Documents%\Visual Studio 2010\Templates\Project templates (по умолчанию).
Открываем студию, создаем новый проект, выбираем корень дерева Visual C# и видим наш проект в списке доступных шаблонов.
Дополнительные улучшения
Можно создавать проекты распределенные по папкам. Для этого необходимо обернуть ProjectTemplateLink в секцию SolutionFolder. Например:
<TemplateContent>
<ProjectCollection>
<SolutionFolder Name= “Folder One”>
<ProjectTemplateLink ProjectName="WinForms">
WinForms\WinForms.vstemplate
</ProjectTemplateLink>
</Solution Folder>
<SolutionFolder />
<ProjectTemplateLink ProjectName="ClassLib">
ClassLibrary\ClassLibrary.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
В самом проекте папки создаются несколько иначе. Откройте vstemplate для проекта и там можно дописать следующее:
<TemplateContent>
<Project TargetFileName="ClassLibrary.csproj" File="ClassLibrary.csproj" ReplaceParameters="true">
<ProjectItem ReplaceParameters="true" TargetFileName="Class1.cs">Class1.cs</ProjectItem>
<Folder Name="Properties" >
<ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
</Folder>
</Project>
</TemplateContent>
И самое главное на данный момент, как создавать ссылки на другие проекты. К сожалению при экспорте проекта, не сохраняются ссылки на другие проекты из текущего решения. Что, по большому счету, понятно, так как экспортируется штатными средствами только один проект в stand-alone виде. Это легко поправить.
Открываем проект, откуда делали заготовки, создаем там все необходимые ссылки между проектами. Теперь открываем файлы проектов в любом текстовом редакторе и ищем узлы с именем ProjectReference. Все это должно быть похоже на
<ItemGroup>
<ProjectReference Include="..\ClassLib\ClassLib.csproj">
<Project>{E4A41DEF-3F17-441F-9135-D5A902D82C8B}</Project>
<Name>ClassLib</Name>
</ProjectReference>
</ItemGroup>
Копируем всю ItemGroup и вставляем в csproj файл в папке экспорта для нужного нам проекта. Все снова упаковываем в архив и помещаем в папку с шаблонами проектов. Теперь при создании нового проекта у вас будут все ссылки на внутренние проекты. Всё!
Интересных проектов вам!
Hard’n’heavy!
Нет обратных ссылок на эту запись.







