T4 包含指示詞
在 Visual Studio 的文字範本中,您可以使用 <#@include#>
指示詞來納入另一個檔案的文字。 您可以將 include
指示詞放在文字範本中第一個 <#+ ... #>
類別功能區塊之前的任何位置。 被納入的檔案也包含 include
指示詞和其他指示詞。 如此可讓您在範本之間共用範本程式碼和重複使用文字。
使用包含指示詞
<#@ include file="filePath" [once="true"] #>
filePath
可以是目前範本檔的絕對路徑或相對路徑。此外,特定的 Visual Studio 擴充功能也可以指定自己的目錄來搜尋 Include 檔。 例如,當您已安裝視覺效果和模型 SDK (DSL 工具)時,下列資料夾會新增至 include 清單:
Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates
。這些額外的 Include 資料夾可能相依於納入的檔案其副檔名。 例如,只有當納入的檔案其副檔名為
.tt
時才能使用 DSL 工具的 Include 資料夾filePath
可以包含以 "%" 分隔的環境變數。 例如:<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>
包含檔案的名稱不需要使用
".tt"
副檔名。您可以使用其他副檔名 (例如
".t4"
) 做為包含檔案的副檔名。 這是因為當您將.tt
檔案加入至專案時,Visual Studio 會自動將 [自訂工具] 屬性設為TextTemplatingFileGenerator
。 您通常不希望被納入的檔案進行個別轉換。另一方面,您應該留意副檔名在某些情況下會影響其他要搜尋 Include 檔的資料夾。 被納入的檔案包含其他檔案時,這一點可能十分重要。
處理所加入的內容時,幾乎可以將此內容當做是進行加入之文字範本的一部分來處理。 而且,即使
<#+...#>
指示詞後面有一般文字或標準控制區塊,您都可以納入包含類別功能區塊include
的檔案。使用
once="true"
確保範本只包含一次,即使它由一個以上的其他 Include 檔案叫用。這項功能可讓您輕鬆地建置可重複使用 T4 程式碼片段的程式庫,而不需要擔心其他程式碼片段已經包含它們。 例如,假設您有一個非常精細的程式碼片段程式庫,可處理範本處理和 C# 產生。 接著,某些更多工作特定的公用程式會使用這些公用程式,例如產生例外狀況,然後您可以從任何應用程式特定的範本使用。 如果您繪製相依性圖形,就會看到某些程式碼片段會被包含數次。 但
once
參數會阻止後續的包含項。MyTextTemplate.tt:
<#@ output extension=".txt" #>
Output message 1 (from top template).
<#@ include file="TextFile1.t4"#>
Output message 5 (from top template).
<#
GenerateMessage(6); // defined in TextFile1.t4
AnotherGenerateMessage(7); // defined in TextFile2.t4
#>
TextFile1.t4:
Output Message 2 (from included file).
<#@ include file="TextFile2.t4" #>
Output Message 4 (from included file).
<#+ // Start of class feature control block.
void GenerateMessage(int n)
{
#>
Output Message <#= n #> (from GenerateMessage method).
<#+
}
#>
TextFile2.t4:
Output Message 3 (from included file 2).
<#+ // Start of class feature control block.
void AnotherGenerateMessage(int n)
{
#>
Output Message <#= n #> (from AnotherGenerateMessage method).
<#+
}
#>
產生的檔案,MyTextTemplate.txt:
Output message 1 (from top template).
Output Message 2 (from included file).
Output Message 3 (from included file 2).
Output Message 4 (from included file).
Output message 5 (from top template).
Output Message 6 (from GenerateMessage method).
Output Message 7 (from AnotherGenerateMessage method).
在 MSBuild 和 Visual Studio 中使用專案屬性。
雖然您可以在 include 指示詞中使用如 $(SolutionDir) 的 Visual Studio 巨集,它們在 MSBuild 中並無法運作。 如果想要轉換組建電腦中的範本,您必須改用專案屬性。
編輯您的 .csproj 或 .vbproj 檔案以定義專案屬性。 這個範例會定義名為 myIncludeFolder
的屬性:
<!-- Define a project property, myIncludeFolder: -->
<PropertyGroup>
<myIncludeFolder>$(MSBuildProjectDirectory)\..\libs</myIncludeFolder>
</PropertyGroup>
<!-- Tell the MSBuild T4 task to make the property available: -->
<ItemGroup>
<T4ParameterValues Include="myIncludeFolder">
<Value>$(myIncludeFolder)</Value>
</T4ParameterValues>
</ItemGroup>
現在您可以在文字範本中使用專案屬性,該屬性在 Visual Studio 和 MSBuild 中會正確轉換:
<#@ include file="$(myIncludeFolder)\defs.tt" #>