Использование 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>