我希望能够为包含以下两个项目的解决方案创建Multi-Project Template(,其中接口应包含对业务层的引用)。:
<proj_name>.interface
<proj_name>.business
。 通常情况下,您可以添加$safeprojectname$
,其中包含:
用户在“新建项目”对话框中提供的名称
然而,正如文章Build a multi-project visual studio template
所指出的那样这里的问题是,在每个子模板中, $ safeprojectname $ 表示当前项目名称。需要有一种方法可以从父模板传入根 $ safeprojectname $ 。
我尝试使用VS 2010 Multi-Project Template: Inter-Project References来实现此问题CustomParameters
中建议的解决方案,但遇到了麻烦。
我的拉链模板目录如下所示:
您可以下载Entire Directory,但这里有一些选择代码段
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>
代码值,则可以获得奖励积分,因为令牌替代品似乎无法正常使用。
答案 0 :(得分:64)
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>
答案 1 :(得分:3)
完全披露:我是下述项目的创建者。
我解决了在多项目模板中的项目模板之间共享信息的问题,即创建一个名为IWizard的GlobalParams实现。它通过在所有解决方案级别参数前加上单词 global 并将其添加到子参数,使解决方案模板级别的信息也可用于运行向导的子模板
如果您使用GlobalParams上述模板并且用户输入了“测试项目”,则以下情况属实:
以上是安全项目名称的示例,但解决方案模板中的所有参数都传递给子模板有关详细信息,请参阅GlobalParams Documentation。