2013-11-14 49 views
1

我们有一个.cs文件和一个.vb文件,每个文件都链接到各自语言的数十个项目中,以提供常用程序集信息。我想通过将它们移动到一个模板来在T4中设置它们之间的共同点。T4:输出文件名称只有扩展名不同

AssemblyInfo.csAssemblyInfo.vb应该是输出文件名。但是,我知道通常,这些模板中的任何一个都将被命名为AssemblyInfo.tt

因为我显然不能有两个完全相同名称的T4模板,我怎样才能输出两个只有扩展名不同的文件?

我不能重新命名要写入的文件,而没有将它们从许多不同的项目中取消链接,然后不得不重新链接它们,这是不可能的。

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

回答

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模板使用两种不同的输出语言。因此,语法高亮也被搞砸了......

希望帮助

+0

感谢您的回答。我已经意识到来自ONE模板的多个文件的限制。由于我在做两种不同的语言,因此我们的想法是将两个独立的模板文件分开,因为它们的一些内容将随语言细节而改变。我的问题在于我需要两个输出的文件与其单个文件扩展名不同。对此有何想法? – UtopiaLtd

+0

您不需要有形的T4编辑器来生成输出代码。 TemplateFileManager也不需要有形的T4编辑器。您也可以将.ttinclude文件的内容复制到您的T4模板中。这样你就不会得到更多的文件。然后你的例如VB.tt可以生成output.vb文件,而CSharp.tt生成output.cs文件。 – Nico

+0

真棒,谢谢! – UtopiaLtd

0

只是把更多的.ttN文件在同一目录。 和规范各.ttN文件中的扩展名:

AppResources.tt  <#@ output extension=".resx" #> 
AppResources.tt2 <#@ output extension=".de.resx" #> 
AppResources.tt3 <#@ output extension=".nl.resx" #> 
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"} 
}; 
相关问题