我希望能够为包含以下两个项目的解决方案创建一个多项目模板(其中接口应包含对业务层的引用)。
-
<proj_name>.interface
-
<proj_name>.business
.
通常,您可以包含 $safeprojectname$
,它具有:
用户在"新建项目"对话框中提供的名称
但是,正如构建多项目可视化工作室模板一文中所述
这里的问题是,在每个子模板中,$safeprojectname$ 表示当前项目名称。需要有一种方法可以从父模板传入根 $safeprojectname$。
我正在尝试通过使用CustomParameters
来实现此SO问题VS 2010多项目模板:项目间引用中建议的解决方案,但是遇到了麻烦。
我的压缩模板目录如下所示:
- 多模板.vs模板
- 接口
- 接口模板.vs模板
- MyTemplate.Interface.csproj
- 商
- 业务模板.vs模板
- MyTemplate.Business.csproj
您可以下载整个目录,但这里有一些精选片段
多模板.vs模板
<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">
InterfaceInterfaceTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="$safeprojectname$.Business">
BusinessBusinessTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
接口\接口模板.vs模板
<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>
标签值,则加分,因为令牌替换似乎不起作用。
Visual Studio 2013 Update 2 终于添加了一种内置方法来执行此操作ProjectTemplateLink
CopyParameters
属性将允许子访问父模板的所有变量,前缀为 ext_
。
您甚至不需要自定义参数。将项目模板链接更改为:
<ProjectTemplateLink ProjectName="$safeprojectname$.Interface" CopyParameters="true">
InterfaceInterfaceTemplate.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>
完全披露:我是下面提到的项目的创建者。
我解决了在多项目模板中的项目模板之间共享信息的问题,即创建一个名为 GlobalParams 的 IWizard 实现。它通过在 ALL 解决方案级别参数前面加上单词 global 并将其添加到子参数中,使解决方案模板级别的信息可供也运行向导的子模板使用。
如果您将 GlobalParams 与上述模板一起使用,并且用户输入了"测试项目",则会出现以下情况:
-
InterfaceTemplate.vstemplate 可以访问
-
$safeprojectname$
= Test_Project.接口 -
$globalsafeprojectname$
= Test_Project
-
-
BusinessTemplate.vstemplate 可以访问
-
$safeprojectname$
= Test_Project.业务 -
$globalsafeprojectname$
= Test_Project
-
以上是安全项目名称的示例,但解决方案模板中的所有参数都传递到子模板 有关详细信息,请参阅 GlobalParams 文档。