T4:输出文件名仅因扩展名而异

时间:2013-11-14 20:02:39

标签: c# visual-studio-2012 t4 template-engine solution

我们有一个.cs文件和一个.vb文件,每个文件都链接到各自语言的几十个项目中,以提供常见的程序集信息。我想通过将每个方法移动到模板来设置它们之间的共同方面。

AssemblyInfo.csAssemblyInfo.vb应该是输出文件名。但是,我知道通常情况下,其中任何一个的T4模板都会命名为AssemblyInfo.tt

由于我显然不能拥有两个名称完全相同的T4模板,如何输出两个只有扩展名不同的文件?

我无法重命名要写入的文件,而无需将它们从许多不同的项目中取消链接,然后再次重新链接它们,所以这是不可能的。

是否有某种指令可用于手动指定输出文件名,以便模板可以有不同的名称?

3 个答案:

答案 0 :(得分:1)

默认情况下,单个T4模板不能有多个输出文件。但是有一些实现可以为您提供这种可能性。例如,如果您使用的是tangible's T4 Editor,则它们会提供一个包含名为“TemplateFileManagerV2.1”的可包含模板的免费模板库。在T4模板中引用它可以生成多个输出文件,即使在解决方案的不同项目中也是如此。

以下是这对你有用的方法:

    <#@ template language="C#" hostSpecific="true" #>
    <#@ include file="TemplateFileManagerV2.1.ttinclude #>

    <#
      var manager = TemplateFileManager.Create(this);
      manager.StartNewFile("output.cs");
    #>
      // content here will be rendered into
      // output.cs file

    <#
      manager.StartNewFile("output.vb");
    #>

      // content here will be rendered into
      // output.vb file
    <#
      manager.Process();
    #>

您可能会遇到困难,因为您在同一个T4模板中使用了两种不同的输出语言。因此语法高亮将搞砸......

希望能帮助

答案 1 :(得分:0)

将更多.ttN文件放在同一目录中。 并规范每个.ttN文件中的扩展名:

AppResources.tt     <#@ output extension=".resx" #>
AppResources.tt2    <#@ output extension=".de.resx" #>
AppResources.tt3    <#@ output extension=".nl.resx" #>

答案 2 :(得分:0)

它比所有这些简单得多。只需将.tt附加到所需的文件名并使用:

<#@ output extension=""#> 

client_stubs.h.tt

<#@ output extension="" encoding="utf-8"#>
<#@ include file="Common.t4" #>

class client_stubs
{
<#
    foreach (string member in class_members.Keys)
    {
#>
    int <#=member#>;
<#
    }
#>
}

client_stubs.cpp.tt

<#@ output extension="" encoding="utf-8"#>
<#@ include file="Common.t4" #>
#include "client_stubs.h"
<#
    foreach (string member in class_members.Keys)
    {
#>
    int client_stubs::<#=member#> = <#=class_members[member]#>;
<#
    }
#>

Common.t4

<#@ template language="C#" #>
<#@ import namespace="System.Collections.Generic" #>
Dictionary<string, string> class_members = new Dictionary() {
    {"m_first", "1"},
    {"m_second", "2"}
};