다음을 통해 공유


T4 Include 지시문

Visual Studio의 텍스트 템플릿에서 <#@include#> 지시문을 사용하여 다른 파일의 텍스트를 포함할 수 있습니다. 텍스트 템플릿에서 첫 번째 클래스 기능 블록 include 앞의 어느 곳에나<#+ ... #> 지시문을 둘 수 있습니다. 포함된 파일에는 include 지시문 및 다른 지시문도 포함할 수 있습니다. 따라서 템플릿 간에 템플릿 코드와 상용구 텍스트를 공유할 수 있습니다.

include 지시문 사용

<#@ include file="filePath" [once="true"] #>
  • 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이 포함된 파일을 포함할 수 있습니다.

  • 템플릿이 둘 이상의 다른 포함 파일에서 호출되는 경우에도 한 번만 포함되도록 하려면 once="true"를 사용합니다.

    이 기능을 사용하면 다른 코드 조각에 이미 포함된 것을 걱정하지 않고 원하는 대로 포함할 수 있는 재사용 가능한 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" #>