T4 템플릿 지시문
Visual Studio T4 텍스트 템플릿은 일반적으로 템플릿의 처리 방식을 지정하는 template
지시문으로 시작합니다. 하나의 텍스트 템플릿 및 템플릿이 포함된 파일에는 템플릿 지시문이 하나만 있어야 합니다.
텍스트 템플릿 작성에 대한 일반적인 개요는 T4 텍스트 템플릿 작성을 참조하세요.
template 지시문 사용
<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>
template
지시문에는 변환의 다양한 측면을 지정할 수 있도록 하는 몇 가지 특성이 있습니다. 모든 특성은 선택적입니다.
compilerOptions 특성
예시:
compilerOptions="optimize+"
유효한 값은
유효한 컴파일러 옵션입니다.
전처리된 런타임 템플릿의 경우 무시됩니다.
이러한 옵션은 템플릿이 Visual C# 또는 Visual Basic으로 변환되고 결과 코드가 컴파일될 때 적용됩니다.
culture 특성
예시:
culture="de-CH"
유효한 값은
"", 기본값인 고정 문화권입니다.
xx-XX 형식의 문자열로 표현된 문화권. 예를 들어 en-US, ja-JP, de-CH, de-DE 등입니다. 자세한 내용은 System.Globalization.CultureInfo를 참조하세요.
식 블록이 텍스트로 변환될 때 사용할 문화권을 지정하는 culture 특성입니다.
debug 특성
예시:
debug="true"
유효한 값은
true
false
(기본값)
debug
특성이 true
인 경우 중간 코드 파일에 디버거가 중단 또는 예외가 발생한 템플릿의 위치를 정확하게 식별할 수 있도록 하는 정보가 포함됩니다.
디자인 타임 템플릿의 경우에는 중간 코드 파일이 %TEMP% 디렉터리에 작성됩니다.
디버거에서 디자인 타임 템플릿을 실행하려면 텍스트 템플릿을 저장한 다음 솔루션 탐색기에서 텍스트 템플릿의 바로 가기 메뉴를 열고 T4 템플릿 디버깅을 선택합니다.
hostspecific 특성
예시:
hostspecific="true"
유효한 값은
true
false
(기본값)
trueFromBase
이 특성의 값을 true
로 설정하면 Host
라는 속성이 텍스트 템플릿에서 생성된 클래스에 추가됩니다. 이 속성은 변환 엔진의 호스트에 대한 참조이며 ITextTemplatingEngineHost로 선언됩니다. 사용자 지정 호스트를 정의한 경우에는 해당 호스트를 사용자 지정 호스트 형식으로 캐스팅할 수 있습니다.
이 속성의 형식이 호스트의 형식에 따라 달라지기 때문에 이 속성은 특정 호스트에서만 작동하는 텍스트 템플릿을 작성하는 경우에만 유용합니다. 이는 런타임 템플릿이 아닌 디자인 타임 템플릿에 적용됩니다.
hostspecific
이 true
이고 Visual Studio를 사용하고 있는 경우 this.Host
를 IServiceProvider로 캐스팅하여 Visual Studio 기능에 액세스할 수 있습니다. Host.ResolvePath(filename)
를 사용하여 프로젝트에서 파일의 절대 경로를 가져올 수도 있습니다. 예시:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<# // Get the Visual Studio API as a service:
DTE dte = ((IServiceProvider)this.Host).GetCOMService(typeof(DTE)) as DTE;
#>
Number of projects in this solution: <#= dte.Solution.Projects.Count #>
<#
// Find a path within the current project:
string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of myFile is:
<#= myFile #>
inherits
와 hostspecific
특성을 함께 사용하는 경우, 파생 클래스에 host="trueFromBase"를 지정하고 기본 클래스에는 host="true"를 지정하십시오. 이렇게 하면 생성된 코드에서 Host
속성의 이중 정의를 피할 수 있습니다.
language 특성
예시:
language="VB"
유효한 값은
C#
(기본값)
VB
language
특성은 문 및 식 블록에서 소스 코드에 사용할 언어(Visual Basic 또는 Visual C#)를 지정합니다. 출력이 생성되는 중간 코드 파일에서 이 언어가 사용됩니다. 이 언어는 템플릿에서 생성되는 언어와 관련이 없으며 모든 종류의 텍스트일 수 있습니다.
예시:
<#@ template language="VB" #>
<#@ output extension=".txt" #>
Squares of numbers:
<#
Dim number As Integer
For number = 1 To 4
#>
Square of <#= number #> is <#= number * number #>
<#
Next number
#>
inherits 특성
템플릿의 프로그램 코드가 텍스트 템플릿에서 생성될 수도 있는 다른 클래스에서 상속하도록 지정할 수 있습니다.
전처리된 런타임 텍스트 템플릿의 상속
런타임 텍스트 템플릿 간에 상속을 사용하여 여러 파생 변형이 있는 기본 템플릿을 만들 수 있습니다. 런타임 템플릿은 사용자 지정 도구 속성이 TextTemplatingFilePreprocessor로 설정된 템플릿입니다. 런타임 템플릿에서는 애플리케이션에서 호출하여 템플릿에 정의된 텍스트를 만들 수 있는 코드를 생성합니다. 자세한 내용은 T4 텍스트 템플릿을 사용하여 런타임 텍스트 생성을 참조하세요.
inherits
특성을 지정하지 않으면 기본 클래스 및 파생 클래스가 텍스트 템플릿에서 생성됩니다. inherits
특성을 지정하면 파생 클래스만 생성됩니다. 기본 클래스를 직접 작성할 수 있지만 기본 클래스에서 파생 클래스에 사용되는 메서드를 제공해야 합니다.
또한 전처리된 다른 템플릿을 기본 클래스로 지정하는 것이 더 일반적입니다. 기본 템플릿에서는 파생 템플릿의 텍스트를 인터리브할 수 있는 공통 텍스트 블록을 제공합니다. 클래스 기능 블록 <#+ ... #>
을 사용하여 텍스트 조각이 들어 있는 메서드를 정의할 수 있습니다. 예를 들어 출력 텍스트의 프레임워크를 기본 템플릿에 둠으로써 파생 템플릿에 재정의할 수 있는 가상 메서드를 제공할 수 있습니다.
전처리된 런타임 텍스트 템플릿 BaseTemplate.tt:
This is the common header.
<#
SpecificFragment1();
#>
A common central text.
<#
SpecificFragment2();
#>
This is the common footer.
<#+
// Declare abstract methods
protected virtual void SpecificFragment1() { }
protected virtual void SpecificFragment2() { }
#>
전처리된 런타임 텍스트 템플릿 DerivedTemplate1.tt:
<#@ template language="C#" inherits="BaseTemplate" #>
<#
// Run the base template:
base.TransformText();
#>
<#+
// Provide fragments specific to this derived template:
protected override void SpecificFragment1()
{
#>
Fragment 1 for DerivedTemplate1
<#+
}
protected override void SpecificFragment2()
{
#>
Fragment 2 for DerivedTemplate1
<#+
}
#>
DerivedTemplate1을 호출할 애플리케이션 코드:
Console.WriteLine(new DerivedTemplate().TransformText());
결과 출력:
This is the common header.
Fragment 1 for DerivedTemplate1
A common central text.
Fragment 2 for DerivedTemplate1
This is the common footer.
서로 다른 프로젝트에서 기본 클래스와 파생 클래스를 빌드할 수 있습니다. 기본 프로젝트 또는 어셈블리를 파생 프로젝트의 참조에 추가해야 합니다.
직접 작성한 일반 클래스를 기본 클래스로 사용할 수도 있습니다. 기본 클래스는 파생 클래스에 사용되는 메서드를 제공합니다.
Warning
inherits
와 hostspecific
특성을 함께 사용하는 경우, 파생 클래스에 hostspecific="trueFromBase"를 지정하고 기본 클래스에는 host="true"를 지정하십시오. 이렇게 하면 생성된 코드에서 Host
속성의 이중 정의를 피할 수 있습니다.
디자인 타임 텍스트 템플릿의 상속
디자인 타임 텍스트 템플릿은 사용자 지정 도구가 TextTemplatingFileGenerator로 설정된 파일입니다. 이 템플릿은 Visual Studio 프로젝트의 일부를 구성하는 코드 또는 텍스트의 출력 파일을 생성합니다. 출력 파일을 생성하기 위해 먼저 템플릿이 중간 프로그램 코드 파일로 변환되며, 대개 이 파일은 보이지 않습니다. inherits
특성은 이 중간 코드를 위한 기본 클래스를 지정합니다.
디자인 타임 텍스트 템플릿의 경우에는 Microsoft.VisualStudio.TextTemplating.TextTransformation 클래스에서 파생되는 기본 클래스를 지정할 수 있습니다. <#@assembly#>
지시문을 사용하여 기본 클래스가 들어 있는 프로젝트나 어셈블리를 로드합니다.
자세한 내용은 Gareth Jones 블로그의 “Inheritance in Text Templates”를 참조하세요.
linePragmas 특성
예시:
linePragmas="false"
유효한 값은
true
(기본값)
false
이 특성을 false로 설정하면 생성된 코드에서 줄 번호를 식별하는 태그가 제거됩니다. 즉, 컴파일러에서 생성된 코드의 줄 번호를 사용하여 모든 오류를 보고하는 것을 의미합니다. 이렇게 하면 텍스트 템플릿 또는 생성된 코드를 디버깅하도록 선택할 수 있어 더 많은 디버깅 옵션을 사용할 있습니다.
이 특성은 소스 코드 컨트롤에 따라 프로그램에서 산만한 병합을 유발하는 정확한 파일 이름을 찾는 경우 유용할 수 있습니다.
표시 유형 특성
예시:
visibility="internal"
유효한 값은
public
(기본값)
internal
런타임 텍스트 템플릿에서 생성된 클래스의 표시 유형 특성을 설정합니다. 기본적으로 클래스는 사용자 코드의 공용 API에 속하지만 visibility="internal"
을 설정하여 사용자의 코드만 텍스트 생성 클래스를 사용할 수 있도록 지정할 수 있습니다.