다음을 통해 공유


T4 텍스트 템플릿 쓰기

업데이트: 2011년 3월

텍스트 템플릿에는 텍스트 템플릿에서 생성될 텍스트가 포함되어 있습니다. 예를 들어, 웹 페이지를 만드는 템플릿에는 "<html>…" 및 HTML 페이지의 다른 모든 표준 부분이 포함됩니다. 템플릿에는 프로그램 코드의 조각인 제어 블록이 삽입됩니다. 제어 블록은 변경되는 값을 제공하고 텍스트의 부분이 조건적이고 반복될 수 있도록 합니다.

이 구조에서는 생성된 파일의 프로토타입에서 시작하고 결과를 변경하는 제어 블록을 증분적으로 삽입할 수 있기 때문에 템플릿을 개발하기가 쉽습니다.

텍스트 템플릿은 다음과 같은 부분으로 구성됩니다.

  • 지시문 - 템플릿이 처리되는 방법을 제어하는 요소입니다.

  • 텍스트 블록 - 출력에 직접 복사되는 내용입니다.

  • 제어 블록 - 변수 값을 텍스트에 삽입하고 텍스트의 조건적 부분이나 반복되는 부분을 제어하는 프로그램 코드입니다.

이 항목의 예제를 실행해 보려면 T4 텍스트 템플릿을 사용하여 디자인 타임 코드 생성에 설명된 대로 템플릿 파일에 예제를 복사합니다. 템플릿 파일을 편집한 후 저장한 다음 출력 .txt 파일을 검사합니다.

지시문

텍스트 템플릿 지시문은 변환 코드와 출력 파일을 생성하는 방법에 대한 텍스트 템플릿 엔진에 일반 명령을 제공합니다.

예를 들어, 다음 지시문은 출력 파일의 확장명이 .txt이도록 지정합니다.

<#@ output extension=".txt" #>

지시문에 대한 자세한 내용은 T4 텍스트 템플릿 지시문을 참조하십시오.

텍스트 블록

텍스트 블록은 출력 파일에 텍스트를 직접 삽입합니다. 텍스트 블록에 대한 특별한 형식 지정은 없습니다. 예를 들어, 다음 텍스트 템플릿은 "Hello"가 포함된 텍스트 파일을 생성합니다.

<#@ output extension=".txt" #>
Hello

제어 블록

제어 블록은 템플릿을 변환하는 데 사용되는 프로그램 코드의 섹션입니다. 기본 언어는 C#이지만 Visual Basic을 사용하려면 파일의 시작 부분에 다음 지시문을 작성하면 됩니다.

<#@ template language="VB" #>

제어 블록의 코드를 작성하는 언어는 생성되는 텍스트의 언어와 무관합니다.

표준 제어 블록

표준 제어 블록은 출력 파일의 부분을 생성하는 프로그램 코드의 섹션입니다.

원하는 수의 텍스트 블록과 표준 제어 블록을 템플릿 파일에 혼합할 수 있습니다. 그러나 한 제어 블록 안에 다른 제어 블록을 배치할 수는 없습니다. 각 표준 제어 블록은 <# ... #> 기호로 구분됩니다.

예를 들어, 다음 제어 블록과 텍스트 블록은 출력 파일에 "0, 1, 2, 3, 4 Hello!" 줄이 포함되도록 합니다.

<#
    for(int i = 0; i < 4; i++)
    {
        Write(i + ", ");
    }
    Write("4");

#> Hello!

명시적 Write() 문을 사용하는 대신 텍스트와 코드를 인터리브할 수 있습니다. 다음 예제에서는 "Hello!"를 네 번 인쇄합니다.

<#
    for(int i = 0; i < 4; i++)
    {
#>
Hello!
<#
    } 
#>

Write(); 문이 코드에서 허용되는 모든 곳에서 텍스트 블록을 삽입할 수 있습니다.

참고

루프나 조건문과 같은 복합 문 안에 텍스트 블록을 포함하는 경우 항상 중괄호 {...}를 사용하여 텍스트 블록을 포함합니다.

식 제어 블록

식 제어 블록은 식을 계산하고 문자열로 변환합니다. 이 문자열은 출력 파일에 삽입됩니다.

식 제어 블록은 <#= ... #> 기호로 구분됩니다.

예를 들어, 다음 제어 블록은 출력 파일에 "5"가 포함되도록 합니다.

<#= 2 + 3 #>

여는 기호에는 세 문자 "<#="가 있습니다.

식에는 범위 안의 어떠한 변수라도 포함될 수 있습니다. 예를 들어, 다음 블록은 숫자가 있는 줄을 출력합니다.

<#@ output extension=".txt" #>
<#
    for(int i = 0; i < 4; i++)
    {
#>
This is hello number <#= i+1 #>: Hello!
<#
    } 
#>

클래스 기능 제어 블록

클래스 기능 제어 블록은 주 변환에 포함되지 않아야 하는 속성, 메서드 또는 다른 모든 코드를 정의합니다. 클래스 기능 블록은 도우미 함수에 흔히 사용됩니다. 일반적으로 클래스 기능 블록은 별도의 파일에 배치되므로 둘 이상의 텍스트 템플릿에 의해 포함될 수 있습니다.

클래스 기능 제어 블록은 <#+ ... #> 기호로 구분됩니다.

예를 들어, 다음 템플릿 파일은 메서드를 선언하고 사용합니다.

<#@ output extension=".txt" #>
Squares:
<#
    for(int i = 0; i < 4; i++)
    {
#>
    The square of <#= i #> is <#= Square(i+1) #>.
<#
    } 
#>
That is the end of the list.
<#+   // Start of class feature block
private int Square(int i)
{
    return i*i;
}
#>

클래스 기능은 클래스 기능이 작성되는 파일의 끝에 배치되어야 합니다. 그러나 include 지시문 뒤에 표준 블록과 텍스트가 있는 경우에도 클래스 기능이 포함된 파일을 <#@include#>할 수 있습니다.

제어 블록에 대한 자세한 내용은 T4 텍스트 템플릿 제어 블록을 참조하십시오.

클래스 기능 블록에 텍스트 블록이 포함될 수 있음

텍스트를 생성하는 메서드를 작성할 수 있습니다. 예를 들면 다음과 같습니다.

List of Squares:
<#
   for(int i = 0; i < 4; i++)
   {  WriteSquareLine(i); }
#>
End of list.
<#+   // Class feature block
private void WriteSquareLine(int i)
{
#>
   The square of <#= i #> is <#= i*i #>.
<#   
}
#>

둘 이상의 템플릿에 의해 포함될 수 있는 텍스트를 생성하는 메서드를 별도의 파일에 두면 특히 유용합니다.

외부 정의 사용

어셈블리

템플릿의 코드 블록에서는 System.dll과 같은 가장 흔히 사용되는 .NET 어셈블리에 정의된 형식을 사용할 수 있습니다. 또한 다른 .NET 어셈블리나 사용자 고유의 어셈블리를 참조할 수 있습니다. 어셈블리의 경로 이름이나 강력한 이름을 제공할 수 있습니다.

<#@ assembly name="System.Xml" #>

절대 경로 이름을 사용하거나 경로 이름에 표준 매크로 이름을 사용해야 합니다. 예를 들면 다음과 같습니다.

<#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>

매크로 목록은 빌드 명령 및 속성 매크로를 참조하십시오.

assembly 지시문은 전처리된 텍스트 템플릿에서 아무런 효과가 없습니다.

자세한 내용은 T4 Assembly 지시문을 참조하십시오.

네임스페이스

import 지시문은 C#의 using 절이나 Visual Basic의 imports 절과 같습니다. 이 지시문을 사용하면 정규화된 이름을 사용하지 않고 코드에서 형식을 참조할 수 있습니다.

<#@ import namespace="System.Xml" #>

assembly 및 import 지시문을 원하는 수만큼 사용할 수 있습니다. 텍스트와 제어 블록 앞에 이러한 지시문을 배치해야 합니다.

자세한 내용은 T4 Import 지시문을 참조하십시오.

코드 및 텍스트 포함

include 지시문은 다른 템플릿 파일에서 텍스트를 삽입합니다. 예를 들어, 이 지시문은 test.txt의 내용을 삽입합니다.

<#@ include file="c:\test.txt" #>

포함된 내용은 포함하는 텍스트 템플릿의 일부인 것처럼 처리됩니다. 그러나 include 지시문 뒤에 일반 텍스트와 표준 제어 블록이 있는 경우에도 클래스 기능 블록 <#+...#>이 포함된 파일을 포함할 수 있습니다.

자세한 내용은 T4 Include 지시문을 참조하십시오.

유틸리티 메서드

Write() 등의 몇 가지 메서드는 제어 블록에서 항상 사용할 수 있습니다. 이러한 메서드에는 출력 들여쓰기에 도움이 되는 메서드와 오류를 보고하기 위한 메서드가 포함됩니다.

사용자 고유의 유틸리티 메서드 집합을 작성할 수도 있습니다.

자세한 내용은 T4 텍스트 템플릿 유틸리티 메서드를 참조하십시오.

데이터 및 모델 변환

텍스트 템플릿을 가장 유용하게 적용하는 경우는 모델, 데이터베이스 또는 데이터 파일과 같은 소스의 내용을 기반으로 자료를 생성할 때입니다. 템플릿은 데이터를 추출하고 형식을 다시 지정합니다. 템플릿의 컬렉션은 이러한 소스를 여러 파일로 변환할 수 있습니다.

소스 파일을 읽는 방법에는 몇 가지가 있습니다.

텍스트 템플릿에서 파일 읽기. 템플릿으로 데이터를 가져오는 가장 간단한 방법입니다.

<#@ import namespace="System.IO" #>
<# string fileContent = File.ReadAllText(@"C:\myData.txt"); ...

탐색 가능한 모델로 파일 로드. 텍스트 템플릿 코드에서 탐색할 수 있는 모델로 데이터를 읽는 더욱 강력한 방법입니다. 예를 들어, XML 파일을 로드하고 XPath 식으로 탐색할 수 있습니다. 또한 xsd.exe를 사용하여 XML 데이터를 읽을 수 있는 클래스의 집합을 만들 수 있습니다.

다이어그램이나 폼에서 모델 파일 편집. Domain-Specific Language Tools에서는 다이어그램이나 Windows 폼으로 모델을 편집할 수 있도록 하는 도구를 제공합니다. 이 도구를 사용하면 생성된 응용 프로그램의 사용자와 모델에 대해 더욱 쉽게 논의할 수 있습니다. Domain-Specific Language Tools는 모델의 구조를 반영하는 강력한 형식의 클래스 집합도 만듭니다. 자세한 내용은 도메인별 언어에서 코드 생성을 참조하십시오.

UML 모델 사용. UML 모델에서 코드를 생성할 수 있습니다. 이 방법은 모델을 익숙한 표기법으로 표현된 다이어그램으로 편집할 수 있다는 장점이 있습니다. 또한 다이어그램을 디자인할 필요가 없습니다. 자세한 내용은 방법: UML 모델에서 파일 생성을 참조하십시오.

상대 파일 경로

텍스트 템플릿에 상대적인 위치에 있는 파일을 참조하려는 경우 this.Host.ResolvePath()를 사용합니다. 또한 다음과 같이 template 지시문에서 hostspecific="true"를 설정해야 합니다.

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.IO" #>
<#
 // Find a path within the same project as the text template:
 string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of MyFile.txt is:
<#= myFile #>

호스트에서 제공하는 다른 서비스를 가져올 수도 있습니다. 자세한 내용은 T4 텍스트 템플릿에서 Visual Studio 또는 다른 호스트 액세스를 참조하십시오.

텍스트 템플릿은 별도의 AppDomain에서 실행됨

텍스트 템플릿은 주 응용 프로그램과는 별도의 AppDomain에서 실행된다는 사실에 유의해야 합니다. 이는 대부분의 경우 중요하지 않지만 복잡한 특정 상황에서는 제한 사항을 발견할 수 있습니다. 예를 들어 별도 서비스의 템플릿에 데이터를 전달하거나 해당 템플릿에서 데이터를 전달받는 경우 서비스에서 serialize 가능한 API를 제공해야 합니다.

템플릿 편집

특수 텍스트 템플릿 편집기를 확장 관리자 온라인 갤러리에서 다운로드할 수 있습니다. 도구 메뉴에서 확장 관리자를 클릭합니다. 온라인 갤러리를 클릭한 다음 검색 도구를 사용합니다.

관련 항목

Task

항목

템플릿을 작성합니다.

T4 텍스트 템플릿 작성 지침

프로그램 코드를 사용하여 텍스트를 생성합니다.

T4 텍스트 템플릿 쓰기

Visual Studio 솔루션에서 파일을 생성합니다.

T4 텍스트 템플릿을 사용하여 디자인 타임 코드 생성

Visual Studio 외부에서 텍스트 생성을 실행합니다.

TextTransform 유틸리티 사용하여 파일 생성

도메인별 언어의 형태로 데이터를 변환합니다.

도메인별 언어에서 코드 생성

자체 데이터 소스를 변환할 지시문 프로세서를 작성합니다.

T4 텍스트 변환 사용자 지정

변경 기록

날짜

변경 내용

이유

2011년 3월

assembly 지시문에 매크로를 사용합니다.

고객 의견