T4 包含指令

在 Visual Studio 的文本模板中,通过使用 <#@include#> 指令可包括来自另一个文件的文本。 可以将 include 指令放置在文本模板中第一个类功能块 <#+ ... #> 前面的任何位置。 包含文件还可以包含 include 指令和其他指令。 这将允许您在模板之间共享模板代码和样本文本。

使用 Include 指令

<#@ include file="filePath" #>
  • filePath 可以是绝对的,或相对于当前模板文件。

    另外,特定 Visual Studio 扩展可以指定其自己的目录以便搜索包含文件。 例如,当您安装了可视化和建模 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).