2013-11-14 145 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"} 
}; 
相關問題