37

我希望能够为包含以下两个项目的解决方案创建一个多项目模板(其中接口应包含对业务层的引用)。:

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

通常,您可以包括$safeprojectname$,它具有:

用户在“新建项目”对话框中提供的名称

但是,正如文章中指出的构建多项目视觉工作室模板

这里的问题是,在每个子模板中,$safeprojectname$代表当前项目名称。需要有一种方法可以从父模板传入根$safeprojectname$ 。

我正在尝试通过 using实施此 SO 问题VS 2010 Multi-Project Template: Inter-Project ReferencesCustomParameters中建议的解决方案,但遇到了麻烦。

我的压缩模板目录如下所示:

  • MultiTemplate.vstemplate
  • 界面
    • 接口模板.vstemplate
    • MyTemplate.Interface.csproj
  • 商业
    • 业务模板.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>标签值,则可以加分,因为令牌替换似乎不起作用。

4

2 回答 2

81

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>
于 2014-06-04T17:05:10.313 回答
3

完全披露:我是下面提到的项目的创建者。

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

如果您将GlobalParams与上述模板一起使用并且用户输入了“测试项目”,则以下情况为真:

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

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

于 2013-11-20T17:57:24.030 回答