Использование CustomParameter с многопроектным шаблоном Visual Studio

Я хотел бы иметь возможность создать шаблон мульти-проекта для решения, которое содержит следующие два проекта (где интерфейс должен включать ссылку на бизнес-уровень):

  • <proj_name>.interface
  • <proj_name>.business,

Обычно вы можете включить $safeprojectname$, у которого есть:

Имя, предоставленное пользователем в диалоговом окне "Новый проект"

Однако, как указано в статье, создайте шаблон многопроектной визуальной студии.

Проблема здесь в том, что в каждом дочернем шаблоне $safeprojectname$ представляет имя текущего проекта. Должен быть способ передать корневой аргумент $safeprojectname$ из родительского шаблона.

Я пытаюсь реализовать решение, предложенное в этом вопросе SO. Многопроектный шаблон VS 2010: межпроектные ссылки, используя CustomParameters, но сталкиваюсь с неприятностями.

Мой каталог шаблонов Zipped Up выглядит следующим образом:

  • MultiTemplate.vstemplate
  • Интерфейс
    • InterfaceTemplate.vstemplate
    • MyTemplate.Interface.csproj
  • Бизнес
    • BusinessTemplate.vstemplate
    • MyTemplate.Business.csproj

Вы можете скачать весь каталог, но вот некоторые отрывки

MultiTemplate.vstemplate

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="ProjectGroup">
  <TemplateData><!--Removed for brevity --></TemplateData>
  <TemplateContent>
    <CustomParameters>
      <CustomParameter Name="$SolutionName$" Value="$safeprojectname$"/>
    </CustomParameters>
    <ProjectCollection>
      <ProjectTemplateLink ProjectName="$safeprojectname$.Interface">
        Interface\InterfaceTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$safeprojectname$.Business">
        Business\BusinessTemplate.vstemplate
      </ProjectTemplateLink>
    </ProjectCollection>
  </TemplateContent>
</VSTemplate>

Интерфейс \ InterfaceTemplate.vstemplate

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData><!--Removed for brevity --></TemplateData>
  <TemplateContent>
    <Project TargetFileName="MyTemplate.Interface.csproj" 
             File="MyTemplate.Interface.csproj"
             ReplaceParameters="true">
    </Project>
  </TemplateContent>
</VSTemplate>

MyTemplate.Interface.csproj

<ItemGroup>
  <ProjectReference Include="..\$SolutionName$.Business\$SolutionName$.Business.csproj">
    <Project>{E5511F75-5B9C-4816-B991-E09225661CF4}</Project>
    <Name>MyTemplate.Business</Name>
  </ProjectReference>
</ItemGroup>

Эта проблема

Когда я создаю новый проект, $SolutionName$ часть строки не заменяется. Вместо этого он остается прежним.

В: Как я могу правильно передать эту информацию из Многопроектного шаблона в каждый из дочерних шаблонов?

Бонусные баллы, если вы можете выяснить, как заменить <name> значение тега, так как замена токенов не работает на нем.

2 ответа

Решение

Полное раскрытие: я создатель нижеупомянутого проекта.

Я решил проблему обмена информацией между шаблонами проектов в многопроектном шаблоне путем создания реализации IWizard под названием GlobalParams. Он делает информацию из уровня шаблона решения доступной для дочерних шаблонов, которые также запускают мастер, добавляя префикс ВСЕ параметры уровня решения к слову global и добавляя его к дочерним параметрам.

Если вы использовали GlobalParams с указанным выше шаблоном, а пользователь ввел "Тестовый проект", будет верно следующее:

  • InterfaceTemplate.vstemplate может получить доступ
    • $ safeprojectname $ = Test_Project.Interface
    • $ globalsafeprojectname $ = Test_Project
  • BusinessTemplate.vstemplate может получить доступ
    • $ safeprojectname $ = Test_Project.Business
    • $ globalsafeprojectname $ = Test_Project

Выше приведен пример безопасного имени проекта, но все параметры из шаблона решения передаются дочернему шаблону. Дополнительные сведения см. В документации GlobalParams.

Visual Studio 2013 Update 2 наконец-то добавил встроенный способ сделать это с ProjectTemplateLink

CopyParameters Атрибут включит дочерний доступ ко всем переменным родительского шаблона с префиксом ext_,

Вам даже не нужны CustomParameters для этого. Измените свой ProjectTemplateLink на это:

<ProjectTemplateLink ProjectName="$safeprojectname$.Interface" CopyParameters="true">
  Interface\InterfaceTemplate.vstemplate
</ProjectTemplateLink>

И тогда вы сможете достичь своей цели у ребенка .csproj вот так:

<ItemGroup>
  <ProjectReference Include="..\$ext_safeprojectname$.Business\$ext_safeprojectname$.Business.csproj">
    <Project>{E5511F75-5B9C-4816-B991-E09225661CF4}</Project>
    <Name>MyTemplate.Business</Name>
  </ProjectReference>
</ItemGroup>
Другие вопросы по тегам