将自定义参数与 Visual Studio 多项目模板结合使用



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

  • <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 文档。

相关内容

  • 没有找到相关文章

最新更新