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

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

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

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

Имя, указанное пользователем в диалоговом окне «Новый проект».

Однако, как указано в статье Создайте шаблон визуальной студии для нескольких проектов

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

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

Моя заархивированная папка шаблонов выглядит так:

  • MultiTemplate.vstemplate
  • Interface
    • InterfaceTemplate.vstemplate
    • MyTemplate.Interface.csproj
  • Business
    • 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>, поскольку замена токенов, похоже, не работает с ним.


person KyleMit    schedule 29.10.2013    source источник
comment
С моей точки зрения (учитывая, что для моего проекта описанный метод работает), единственной причиной, по которой VS не заменяет токены, может быть тип проекта. К сожалению, сейчас у меня мало времени, чтобы проверить это, но я советую вам создать аналогичный шаблон с типом веб-проекта и проверить, заменяются ли токены только для типа веб-проекта ...   -  person IvanL    schedule 29.10.2013
comment
Вы бы подумали об изменении принятого ответа? Исходный ответ размещен только на Codeplex, который будет закрыт позже в 2017 году.   -  person friggle    schedule 25.04.2017
comment
Как автор отмеченного в данный момент ответа, я поддерживаю замену его ответом @friggle. Лучшее решение - использование новых встроенных функций.   -  person Troy Palacino    schedule 17.07.2019
comment
@TroyPalacino, да, хороший звонок. Спасибо за толчок. Получите несколько бонусов в качестве утешительного приза   -  person KyleMit    schedule 18.07.2019


Ответы (2)


В 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>
person friggle    schedule 04.06.2014
comment
как бы вы переименовали файлы с помощью шаблонов? - person Alex Gordon; 30.09.2018
comment
Можно ли разрешить передачу значений параметров cusotm дочерним шаблонам? - person Alex Gordon; 03.10.2018
comment
@AlexGordon Я просто использовал пользовательские параметры, и $ ext_mycustomparam $ сработал. - person Rhyous; 12.11.2018

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

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

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

  • InterfaceTemplate.vstemplate could access
    • $safeprojectname$ = Test_Project.Interface
    • $globalsafeprojectname$ = Test_Project
  • BusinessTemplate.vstemplate could access
    • $safeprojectname$ = Test_Project.Business
    • $globalsafeprojectname$ = Test_Project

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

person Troy Palacino    schedule 20.11.2013