Создание многопроектных шаблонов

Шаблоны с несколькими проектами выполняют роль контейнеров для двух или нескольких проектов 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>

Создание многопроектного шаблона из существующего решения

  1. Создайте решения и добавьте два или более проектов.

  2. Настройте проекты для экспорта в шаблон.

    Совет

    Если вы используете параметры шаблона и хотите ссылаться на переменные из родительского шаблона, укажите перед именем параметра префикс ext_. Например, $ext_safeprojectname$. Кроме того, задайте атрибуту CopyParameters элемента ProjectTemplateLink значение true.

    <ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
    
  3. В меню Проект выберите команду Экспорт шаблона.

    Открывается мастер экспорта шаблонов.

  4. На странице Выбор типа шаблона выберите Шаблон проекта. Выберите один из проектов, который необходимо экспортировать в шаблон, а затем нажмите кнопку Далее. (Вы будете повторять эти действия для каждого проекта в решении.)

  5. На странице Выбор параметров шаблона введите имя шаблона и необязательное описание, значок и рисунок предварительного просмотра для шаблона. Нажмите кнопку Готово.

    Проект будет экспортирован в ZIP-файл и помещен в указанное выходное расположение.

    Примечание.

    Каждый проект необходимо отдельно экспортировать в шаблон, поэтому повторите предыдущие шаги для каждого проекта в решении.

  6. Создайте каталог для шаблона, содержащий вложенный каталог для каждого проекта.

  7. Извлеките содержимое ZIP-файла каждого проекта в соответствующий созданный вложенный каталог.

  8. В базовом каталоге создайте XML-файл с расширением VSTEMPLATE. Этот файл содержит метаданные для многопроектного шаблона. Пример структуры файла приведен ниже. Укажите относительный путь к файлу VSTEMPLATE каждого проекта.

  9. Выберите все файлы в базовом каталоге и в контекстном меню выберите пункты Отправить в>Сжатая ZIP-папка.

    Файлы и папки сжимаются в ZIP-файл.

  10. Скопируйте ZIP-файл в пользовательский каталог шаблона проекта. По умолчанию это каталог %USERPROFILE%\Documents\Visual Studio <версия>\Templates\ProjectTemplates.

  11. В 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>