我们有一个.cs文件和一个.vb文件,每个文件都链接到各自语言的几十个项目中,以提供常见的程序集信息。我想通过将每个方法移动到模板来设置它们之间的共同方面。
AssemblyInfo.cs
和AssemblyInfo.vb
应该是输出文件名。但是,我知道通常情况下,其中任何一个的T4模板都会命名为AssemblyInfo.tt
。
由于我显然不能拥有两个名称完全相同的T4模板,如何输出两个只有扩展名不同的文件?
我无法重命名要写入的文件,而无需将它们从许多不同的项目中取消链接,然后再次重新链接它们,所以这是不可能的。
是否有某种指令可用于手动指定输出文件名,以便模板可以有不同的名称?
答案 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"}
};