Создание многопроектных шаблонов
Шаблоны с несколькими проектами выполняют роль контейнеров для двух или нескольких проектов Visual Studio. При создании проекта на основе многопроектного шаблона каждый проект в шаблоне добавляется в решение.
Примечание.
Шаблоны, рассмотренные в этой статье, являются теми, которые используются при создании проектов в Visual Studio, а не тех, которые dotnet new
создаются.
Многопроектный шаблон содержит два или несколько шаблонов проектов с корневым шаблоном типа ProjectGroup.
Многопроектные шаблоны ведут себя иначе, чем шаблоны для одного проекта. Они имеют следующие уникальные характеристики:
Отдельным проектам в многопроектном шаблоне невозможно назначить имена, если этот шаблон используется для создания проекта. Вместо этого нужно использовать атрибут ProjectName элемента ProjectTemplateLink в файле VSTEMPLATE, чтобы указать имя для каждого проекта.
Многопроектные шаблоны могут содержать проекты для разных языков, но сам шаблон можно поместить только в одну категорию. Категория шаблона указывается в элементе ProjectType файла VSTEMPLATE.
Многопроектный шаблон должен включать следующие элементы, сжатые в ZIP-файл:
Корневой файл VSTEMPLATE для всего многопроектного шаблона. Этот корневой файл VSTEMPLATE содержит метаданные, отображаемые в диалоговом окне создания проекта. Он также указывает место поиска файлов VSTEMPLATE для проектов в этом шаблоне. Этот файл должен находиться в корне ZIP-файла.
Две или более папок, содержащих файлы, которые нужны для завершения шаблона проекта. К ним относятся все файлы кода для проекта, а также файл VSTEMPLATE.
Например, ZIP-файл многопроектного шаблона с двумя проектами может иметь следующие файлы и каталоги:
- MultiProjectTemplate.vstemplate
- \Project1\MyTemplate.vstemplate
- \Project1\Project1.vbproj
- \Project1\Class.vb
- \Project2\MyTemplate.vstemplate
- \Project2\Project2.vbproj
- \Project2\Class.vb
Корневой файл VSTEMPLATE многопроектного шаблона отличается от однопроектного шаблона следующим образом:
Атрибут Тип элемента VSTemplate имеет значение ProjectGroup вместо Project. Например:
<VSTemplate Version="2.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
Элемент TemplateContent содержит элемент ProjectCollection, который имеет один или несколько элементов ProjectTemplateLink, задающих пути к файлам vstemplate включенных проектов. Например:
<TemplateContent> <ProjectCollection> <ProjectTemplateLink> Project1\MyTemplate.vstemplate </ProjectTemplateLink> <ProjectTemplateLink> Project2\MyTemplate.vstemplate </ProjectTemplateLink> </ProjectCollection> </TemplateContent>
Совет
Если вам нужно, чтобы в диалоговом окне создания проекта отображался только многопроектный шаблон, а не его отдельные проекты, пометьте внутренние шаблоны как скрытые. Например:
<VSTemplate Type="Project" ... >
<TemplateData>
...
<Hidden>true</Hidden>
</TemplateData>
...
</VSTemplate>
Создание многопроектного шаблона из существующего решения
Создайте решения и добавьте два или более проектов.
Настройте проекты для экспорта в шаблон.
Совет
Если вы используете параметры шаблона и хотите ссылаться на переменные из родительского шаблона, укажите перед именем параметра префикс
ext_
. Например,$ext_safeprojectname$
. Кроме того, задайте атрибуту CopyParameters элемента ProjectTemplateLink значение true.<ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
В меню Проект выберите команду Экспорт шаблона.
Открывается мастер экспорта шаблонов.
На странице Выбор типа шаблона выберите Шаблон проекта. Выберите один из проектов, который необходимо экспортировать в шаблон, а затем нажмите кнопку Далее. (Вы будете повторять эти действия для каждого проекта в решении.)
На странице Выбор параметров шаблона введите имя шаблона и необязательное описание, значок и рисунок предварительного просмотра для шаблона. Нажмите кнопку Готово.
Проект будет экспортирован в ZIP-файл и помещен в указанное выходное расположение.
Примечание.
Каждый проект необходимо отдельно экспортировать в шаблон, поэтому повторите предыдущие шаги для каждого проекта в решении.
Создайте каталог для шаблона, содержащий вложенный каталог для каждого проекта.
Извлеките содержимое ZIP-файла каждого проекта в соответствующий созданный вложенный каталог.
В базовом каталоге создайте XML-файл с расширением VSTEMPLATE. Этот файл содержит метаданные для многопроектного шаблона. Пример структуры файла приведен ниже. Укажите относительный путь к файлу VSTEMPLATE каждого проекта.
Выберите все файлы в базовом каталоге и в контекстном меню выберите пункты Отправить в>Сжатая ZIP-папка.
Файлы и папки сжимаются в ZIP-файл.
Скопируйте ZIP-файл в пользовательский каталог шаблона проекта. По умолчанию это каталог %USERPROFILE%\Documents\Visual Studio <версия>\Templates\ProjectTemplates.
В Visual Studio выберите Файл>Создать>Проект и убедитесь, что шаблон отображается.
Пример для двух проектов
В этом примере показан простой корневой файл VSTEMPLATE, включающий несколько проектов. В этом примере шаблон содержит два проекта: Мое приложение Windows и Моя библиотека классов. Атрибут ProjectName элемента ProjectTemplateLink задает имя, которое назначено проекту.
Совет
Если атрибут ProjectName не указан, в качестве имени проекта используется имя файла VSTEMPLATE.
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Multi-Project Template Sample</Name>
<Description>An example of a multi-project template</Description>
<Icon>Icon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="My Windows Application">
WindowsApp\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="My Class Library">
ClassLib\MyTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
Пример с папками решений
В этом примере используется элемент SolutionFolder для разделения проектов на две группы, Math Classes и Graphics Classes. Шаблон содержит четыре проекта, два из которых размещаются в отдельных папках решения.
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Multi-Project Template Sample</Name>
<Description>An example of a multi-project template</Description>
<Icon>Icon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<SolutionFolder Name="Math Classes">
<ProjectTemplateLink ProjectName="MathClassLib1">
MathClassLib1\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="MathClassLib2">
MathClassLib2\MyTemplate.vstemplate
</ProjectTemplateLink>
</SolutionFolder>
<SolutionFolder Name="Graphics Classes">
<ProjectTemplateLink ProjectName="GraphicsClassLib1">
GraphicsClassLib1\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="GraphicsClassLib2">
GraphicsClassLib2\MyTemplate.vstemplate
</ProjectTemplateLink>
</SolutionFolder>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
Пример со ссылками на проекты
В этом примере показано, как добавить ссылки на проект в шаблон с несколькими проектами и, по сути, является расширением примера шаблона с несколькими проектами.
В этом примере решение содержит два проекта MultiProject.Client и MultiProject.Shared. Проект MultiProject.Client ссылается на MultiProject.Shared.
Структура папок выглядит следующим образом:
- MultiProjectTemplate.vstemplate
- \MultiProject.Client\MultiProject.Client.csproj
- \MultiProject.Client\MyTemplate.vstemplate
- \MultiProject.Shared\MultiProject.Shared.csproj
- \MultiProject.Shared\MyTemplate.vstemplate
Когда шаблон используется часть MultiProject , заменяется именем проекта, в который вводится пользователь.
MultiProjectTemplate.vstemplate выглядит следующим образом. Обратите внимание, что в ProjectTemplateLinkатрибут CopyParameters задано значение true , а атрибуты ProjectName используют переменную шаблона $safeprojectname$.
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
...
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="$safeprojectname$.Client" CopyParameters="true">
MultiProject.Client\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="$safeprojectname$.Shared" CopyParameters="true">
MultiProject.Shared\MyTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
MultiProject.Client \MyTemplate.vstemplate может выглядеть примерно так: Обратите внимание, что тег Project имеет атрибут ReplaceParameters с значением true.
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
...
<TemplateContent>
<Project TargetFileName="MultiProject.Client.csproj" File="MultiProject.Client.csproj" ReplaceParameters="true">
...
</Project>
</TemplateContent>
</VSTemplate>
MultiProject.Client \MultiProject.Client.csproj может выглядеть примерно так: Обратите внимание, что атрибут Include of ProjectReference использует переменную шаблона $ext_safeprojectname$
<Project>
...
<ItemGroup>
<ProjectReference Include="..\$ext_safeprojectname$.Shared\$ext_safeprojectname$.Shared.csproj" />
</ItemGroup>
</Project>