将CustomParameter与Visual Studio多项目模板一起使用

时间:2013-10-29 15:40:34

标签: visual-studio-2010 visual-studio visual-studio-templates

我希望能够为包含以下两个项目的解决方案创建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中建议的解决方案,但遇到了麻烦。

我的拉链模板目录如下所示:

  • MultiTemplate.vstemplate
  • 接口
    • InterfaceTemplate.vstemplate
    • MyTemplate.Interface.csproj
  • 商业
    • BusinessTemplate.vstemplate
    • MyTemplate.Business.csproj

您可以下载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>代码值,则可以获得奖励积分,因为令牌替代品似乎无法正常使用。

2 个答案:

答案 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)

完全披露:我是下述项目的创建者。

我解决了在多项目模板中的项目模板之间共享信息的问题,即创建一个名为IWizardGlobalParams实现。它通过在所有解决方案级别参数前加上单词 global 并将其添加到子参数,使解决方案模板级别的信息也可用于运行向导的子模板

如果您使用GlobalParams上述模板并且用户输入了“测试项目”,则以下情况属实:

  • InterfaceTemplate.vstemplate 可以访问
    • $ safeprojectname $ = Test_Project.Interface
    • $ globalsafeprojectname $ = Test_Project
  • BusinessTemplate.vstemplate 可以访问
    • $ safeprojectname $ = Test_Project.Business
    • $ globalsafeprojectname $ = Test_Project

以上是安全项目名称的示例,但解决方案模板中的所有参数都传递给子模板有关详细信息,请参阅GlobalParams Documentation

相关问题