T4 インクルード ディレクティブ
Visual Studio のテキスト テンプレートでは、<#@include#> ディレクティブを使用することによって、別のファイルのテキストをインクルードできます。include ディレクティブは、テキスト テンプレートに含まれる最初のクラス機能ブロック (<#+ ... #>) の前の任意の場所に配置できます。インクルード ファイルに、include ディレクティブや他のディレクティブを含めることもできます。これにより、テンプレート間でテンプレート コードや定型句を共有できるようになります。
include ディレクティブの使用
<#@ include file="filePath" #>
filePath には、絶対パスを指定することも、現在のテンプレート ファイルを基準とした相対パスを指定することもできます。
また、特定の Visual Studio 拡張機能で独自のディレクトリを指定して、インクルード ファイルを検索することもできます。たとえば、Visualization and Modeling SDK (DSL ツール) がインストールされている場合は、インクルード一覧に Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates フォルダーが追加されます。
追加されるこれらのインクルード フォルダーは、インクルード ファイルの拡張子によって異なります。たとえば、DSL ツールのインクルード フォルダーは、インクルード ファイルの拡張子が .tt の場合にのみ追加されます。
filePath には、"%" で区切られた環境変数を含めることもできます。次に例を示します。
<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>
インクルード ファイルの名前は、拡張機能を使用する必要はありません".tt"。
などの他の拡張機能を使用することができます".t4"を含めるファイル。これは、.tt ファイルをプロジェクトに追加すると、Visual Studio によって "カスタム ツール" プロパティが自動的に TextTemplatingFileGenerator に設定されるためです。通常、インクルード ファイルを個別に変換することは望ましくありません。
一方、ファイルの拡張子によって、インクルード ファイルの検索先となる追加フォルダーが決まる場合があることに注意してください。これは、インクルード ファイルに他のファイルが含まれている場合に重要となります。
インクルードされたコンテンツは、インクルード先のテキスト テンプレートに元から含まれていた場合とほとんど同じように処理されます。ただし、include ディレクティブの後に通常のテキスト ブロックと標準コントロール ブロックが続く場合でも、クラス機能ブロック (<#+...#>) を含むファイルをインクルードすることができます。
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).