다음을 통해 공유


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

업데이트: 2010년 10월

디자인 타임 T4 텍스트 템플릿을 사용하면 Visual Studio 프로젝트에서 프로그램 코드 및 다른 파일을 생성할 수 있습니다. 일반적으로 모델의 데이터에 따라 생성되는 코드가 달라지도록 템플릿을 작성합니다. 모델은 응용 프로그램의 요구 사항에 대한 주요 정보가 들어 있는 파일이나 데이터베이스입니다.

예를 들어 워크플로를 테이블이나 다이어그램으로 정의하는 모델이 있을 수 있습니다. 이 모델에서 워크플로를 실행하는 소프트웨어를 생성할 수 있습니다. 사용자의 요구 사항이 변경되는 경우 사용자와 새 워크플로에 대해 쉽게 논의할 수 있습니다. 워크플로에서 코드를 다시 생성하는 것이 코드를 직접 업데이트하는 것보다 더 안정적입니다.

참고

모델은 응용 프로그램의 특정 측면을 설명하는 데이터 소스입니다. 모델은 모든 형태 및 유형의 파일이나 데이터베이스일 수 있으며 UML 모델이나 도메인별 언어 모델과 같은 특정 형태일 필요가 없습니다. 일반적인 모델은 테이블이나 XML 파일 형태입니다.

코드 생성에 대해서는 이미 잘 알고 있을 것입니다. Visual Studio 솔루션의 .resx 파일에서 리소스를 정의하면 일련의 클래스와 메서드가 자동으로 생성됩니다. 리소스 파일을 사용하면 클래스와 메서드를 편집해야 하는 경우보다 훨씬 쉽고 더욱 안정적으로 리소스를 편집할 수 있습니다. 텍스트 템플릿을 사용하는 경우 사용자가 디자인한 소스에서 동일한 방식으로 코드를 생성할 수 있습니다.

텍스트 템플릿에는 생성하려는 텍스트와 텍스트의 변수 부분을 생성하는 프로그램 코드가 혼합되어 있습니다. 프로그램 코드를 사용하면 생성된 텍스트의 일부를 반복하거나 조건에 따라 생략할 수 있습니다. 생성되는 파일은 응용 프로그램의 일부를 구성할 프로그램 코드 자체일 수 있습니다.

디자인 타임 T4 텍스트 템플릿 만들기

Visual Studio에서 디자인 타임 T4 템플릿을 만들려면

  1. Visual Studio 프로젝트를 만들거나 기존 프로젝트를 엽니다.

    예를 들어, 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.

  2. 텍스트 템플릿 파일을 프로젝트에 추가하고 NewTemplate.tt로 이름을 지정합니다.

    이렇게 하려면 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다. 새 항목 추가 대화 상자의 템플릿 창에서 텍스트 템플릿을 선택합니다. 파일 이름을 NewTemplate.tt로 지정합니다.

    파일의 사용자 지정 도구 속성이 TextTemplatingFileGenerator임을 확인할 수 있습니다.

  3. 파일을 엽니다. 파일에 다음 지시문이 이미 포함되어 있습니다.

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".txt" #>
    

    Visual Basic 프로젝트에 템플릿을 추가한 경우 언어 특성은 "VB"입니다.

  4. 파일의 끝 부분에 일부 텍스트를 추가합니다. 예를 들면 다음과 같습니다.

    Hello, world!
    
  5. 파일을 저장합니다.

    템플릿을 실행할지 묻는 보안 경고 메시지 상자가 표시될 수 있습니다. 확인을 클릭합니다.

  6. 솔루션 탐색기에서 NewTemplate.tt 노드를 확장하고 NewTemplate.txt라는 파일을 확인합니다. 이 파일에는 입력한 텍스트가 포함되어 있습니다.

    참고

    프로젝트가 Visual Basic 프로젝트인 경우 NewTemplate.txt 출력 파일을 표시하려면 모든 파일 표시를 클릭해야 합니다.

코드 다시 생성

다음과 같은 경우에 템플릿이 실행되면 보조 파일이 생성됩니다.

  • 템플릿을 편집한 다음 포커스를 다른 Visual Studio 창으로 변경하는 경우

  • 템플릿을 저장하는 경우

  • 솔루션 탐색기 도구 모음에서 모든 템플릿 변환을 클릭합니다. 그러면 Visual Studio 솔루션에서 모든 템플릿이 변환됩니다.

  • 솔루션 탐색기에서 하나 이상의 파일을 마우스 오른쪽 단추로 클릭한 다음 사용자 지정 도구 실행을 클릭합니다. 이 방법을 사용하여 선택한 템플릿 집합을 변환할 수 있습니다.

템플릿에서 읽은 데이터 파일이 변경되었을 때 템플릿이 실행되도록 Visual Studio 프로젝트를 설정할 수도 있습니다. 자세한 내용은 자동으로 코드 다시 생성을 참조하십시오.

가변 텍스트 생성

텍스트 템플릿을 통해 프로그램 코드를 사용하여 생성된 파일의 콘텐츠를 변경할 수 있습니다.

프로그램 코드를 사용하여 텍스트를 생성하려면

  1. .tt 파일의 내용을 다음과 같이 변경합니다.

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".txt" #>
    <#int top = 10;
    
    for (int i = 0; i<=top; i++) { #>
    The square of <#= i #> is <#= i*i #>
    <# } #>
    
    <#@ template debug="false" hostspecific="false" language="VB" #>
    <#@ output extension=".txt" #>
    <#Dim top As Integer = 10
    
    For i As Integer = 0 To top
    #>
        The square of <#= i #> is <#= i*i #>
    <#
    Next
    #>
    
  2. .tt 파일을 저장하고 생성된 .txt 파일을 다시 검사합니다. 이 파일에는 0에서 9까지의 숫자를 제곱한 값이 나열되어 있습니다.

문은 <#...#> 안에 포함되고 단일 식은 <#=...#> 안에 포함됩니다. 자세한 내용은 T4 텍스트 템플릿 쓰기을 참조하십시오.

Visual Basic에서 생성하는 코드를 작성하는 경우 template 지시문에 language="VB"를 포함해야 합니다. "C#"이 기본값입니다.

솔루션의 코드 또는 리소스 생성

모델에 따라 변경되는 프로그램 파일을 생성할 수 있습니다. 모델은 데이터베이스, 구성 파일, UML 모델, DSL 모델 또는 기타 소스와 같은 입력입니다. 일반적으로 동일한 모델에서 여러 프로그램 파일을 생성합니다. 이를 위해 생성된 각 프로그램 파일에 대한 템플릿 파일을 만들고 모든 템플릿에서 동일한 모델을 읽게 합니다.

프로그램 코드 또는 리소스를 생성하려면

  1. 출력 지시문을 변경하여 .cs, .vb, .resx 또는 .xml과 같은 적절한 형식의 파일을 생성합니다.

  2. 필요한 솔루션 코드를 생성할 코드를 삽입합니다. 예를 들어, 클래스에서 세 가지 정수 필드 선언을 생성하려는 경우는 다음과 같습니다.

                      <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".cs" #>
    <# var properties = new string [] {"P1", "P2", "P3"}; #>
    class MyGeneratedClass {
    <# 
      foreach (string propertyName in properties)
      { #>
      private int <#= propertyName #> = 0;
    <# } #>
    }
    
    <#@ template debug="false" hostspecific="false" language="VB" #>
    <#@ output extension=".cs" #>
    <# Dim properties = {"P1", "P2", "P3"} #>
    class MyGeneratedClass {
    <# 
       For Each propertyName As String In properties
    #>
      private int <#= propertyName #> = 0;
    <#
       Next
    #>
    }
    
  3. 파일을 저장하고 생성된 파일을 검사합니다. 이제 생성된 파일에는 다음 코드가 포함되어 있습니다.

    class MyGeneratedClass {
      private int P1 = 0; 
      private int P2 = 0;
      private int P3 = 0;
    }
    

코드 생성 및 생성된 텍스트

프로그램 코드를 생성할 때 템플릿에서 실행되는 생성하는 코드와 솔루션의 일부가 되는 생성된 결과 코드를 혼동하지 않도록 하는 것이 가장 중요합니다. 두 언어가 반드시 같을 필요는 없습니다.

이전 예제는 두 가지 버전이 있습니다. 한 버전에서는 C#으로 코드를 생성하고 다른 버전에서는 Visual Basic으로 코드를 생성합니다. 그러나 두 버전에서 생성된 텍스트는 동일하며 C# 클래스입니다.

마찬가지로 Visual C# 템플릿을 사용하여 임의의 언어로 코드를 생성할 수 있습니다. 생성된 텍스트는 특정 언어로 이루어질 필요가 없으며 프로그램 코드가 아니어도 됩니다.

텍스트 템플릿 구성

템플릿 코드를 다음과 같이 두 부분으로 분리하는 것이 좋습니다.

  • 구성 또는 데이터 수집 부분: 변수에 값을 설정하며 텍스트 블록을 포함하지 않습니다. 이전 예제에서 이 부분은 properties의 초기화입니다.

    또한 인스토어(in-store) 모델을 생성하므로 "모델" 섹션이라고도 하며 대개 모델 파일을 읽습니다.

  • 텍스트 생성 부분(예제의 foreach(...){...}): 변수 값을 사용합니다.

템플릿 코드를 반드시 분리해야 하는 것은 아니지만 분리하면 텍스트를 포함하는 부분의 복잡한 정도가 줄어들어 템플릿을 더 쉽게 읽을 수 있습니다.

파일 또는 기타 소스 읽기

모델 파일이나 데이터베이스에 액세스하기 위해 템플릿 코드에서 System.XML 등의 어셈블리를 사용할 수 있습니다. 이러한 어셈블리에 액세스하려면 다음과 같은 지시문을 삽입해야 합니다.

<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.IO" #>

assembly 지시문을 사용하면 Visual Studio 프로젝트의 References 섹션과 동일한 방식으로, 지정된 어셈블리를 템플릿 코드에서 사용할 수 있습니다. 자동으로 참조되는 System.dll에 대한 참조를 포함할 필요가 없습니다. import 지시문을 사용하면 일반 프로그램 파일의 using 지시문과 동일한 방식으로, 정규화된 이름을 사용하지 않고 형식을 사용할 수 있습니다.

예를 들어 System.IO를 가져온 후 다음과 같이 작성할 수 있습니다.

          <# var properties = File.ReadLines("C:\\propertyList.txt");#>
...
<# foreach (string propertyName in properties) { #>
...
<# For Each propertyName As String In 
             File.ReadLines("C:\\propertyList.txt")
#>

상대 경로 이름을 가진 파일 열기

this.Host.ResolvePath()를 사용하여 텍스트 템플릿에 상대적인 위치에서 파일을 로드할 수 있습니다. this.Host를 사용하려면 template에서 hostspecific="true"를 설정해야 합니다.

<#@ template debug="false" hostspecific="true" language="C#" #>

그런 다음 다음과 같이 작성할 수 있습니다.

<# string fileName = this.Host.ResolvePath("filename.txt");
  string [] properties = File.ReadLines(filename);
#>
...
<#  foreach (string propertyName in properties { #>
...
<# Dim fileName = Me.Host.ResolvePath("propertyList.txt")
   Dim properties = File.ReadLines(filename)
#>
...
<#   For Each propertyName As String In properties
...
#>

현재 템플릿 파일 이름을 식별하는 this.Host.TemplateFile을 사용할 수도 있습니다.

this.Host(VB에서는 Me.Host)의 형식은 Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost입니다.

Visual Studio에서 데이터 가져오기

Visual Studio에서 제공하는 서비스를 사용하려면 hostSpecific 특성을 설정하고 EnvDTE 어셈블리를 로드합니다. 예를 들면 다음과 같습니다.

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#
  IServiceProvider serviceProvider = (IServiceProvider)this.Host;
  EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetService(typeof(EnvDTE.DTE));
#>

Number of projects in this VS solution:  <#= dte.Solution.Projects.Count #>

자동으로 코드 다시 생성

일반적으로 Visual Studio 솔루션의 여러 파일이 하나의 입력 모델을 사용하여 생성됩니다. 각 파일은 자체 템플릿에서 생성되지만 모든 템플릿은 동일한 모델을 참조합니다.

소스 모델이 변경되면 솔루션의 모든 템플릿을 다시 실행해야 합니다. 이 작업을 수동으로 수행하려면 솔루션 탐색기 도구 모음에서 모든 템플릿 변환을 클릭합니다.

Visual Studio Visualization and Modeling SDK를 설치한 경우 빌드를 수행할 때마다 모든 템플릿이 자동으로 변환되게 할 수 있습니다. 이렇게 하려면 텍스트 편집기에서 프로젝트 파일(.csproj 또는 .vbproj)을 편집하고 파일의 끝 부분 근처에서 모든 <import> 문 뒤에 다음 코드를 추가합니다.

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
<PropertyGroup>
   <TransformOnBuild>true</TransformOnBuild>
   <!-- Other properties can be inserted here -->
</PropertyGroup>

자세한 내용은 빌드 프로세스의 코드 생성을 참조하십시오.

오류 보고

Visual Studio 오류 창에 오류 및 경고 메시지를 표시하려면 다음 방법을 사용할 수 있습니다.

Error("An error message");
Warning("A warning message");

기존 파일을 템플릿으로 변환

템플릿의 유용한 기능은 삽입된 일부 프로그램 코드와 함께 템플릿에서 생성하는 파일과 매우 유사하다는 점입니다. 이는 템플릿을 만드는 유용한 방법을 제시합니다. 먼저 일반 파일을 프로토타입(예: Visual C# 파일)으로 만든 다음 결과 파일을 변경하는 생성 코드를 점차적으로 도입합니다.

기존 파일을 디자인 타임 템플릿으로 변환하려면

  1. .cs, .vb 또는 .resx 파일과 같은 생성할 형식의 파일을 Visual Studio 프로젝트에 추가합니다.

  2. 새 파일을 테스트하여 제대로 작동하는지 확인합니다.

  3. 솔루션 탐색기에서 파일 확장명을 .tt로 변경합니다.

  4. .tt 파일의 다음 속성을 확인합니다.

    사용자 지정 도구 =

    TextTemplatingFileGenerator

    빌드 작업 =

    없음

  5. 파일의 시작 부분에 다음 코드를 삽입합니다.

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".cs" #>
    

    Visual Basic에서 템플릿의 생성하는 코드를 작성하려면 language 특성을 "C#" 대신 "VB"로 설정합니다.

    extension 특성을 생성할 파일 형식에 대한 파일 확장명(예: .cs, .resx 또는 .xml)으로 설정합니다.

  6. 파일을 저장합니다.

    보조 파일이 지정된 확장명을 사용하여 만들어집니다. 이 파일의 속성은 파일 형식에 대해 올바릅니다. 예를 들어, .cs 파일의 빌드 작업 속성은 컴파일입니다.

    생성된 파일에 원래 파일과 동일한 콘텐츠가 포함되어 있는지 확인합니다.

  7. 변경할 파일의 부분을 식별합니다. 예를 들어, 특정 조건에서만 나타나는 부분이나 반복되는 부분 또는 특정 값이 변경되는 위치를 식별합니다. 생성하는 코드를 삽입합니다. 파일을 저장하고 보조 파일이 올바르게 생성되는지 확인합니다. 이 단계를 반복합니다.

코드 생성 지침

T4 텍스트 템플릿 작성 지침을 참조하십시오.

다음 단계

다음 단계

항목

보조 함수, 포함된 파일 및 영구 데이터를 사용하는 코드로 더욱 고급 텍스트 템플릿을 작성하고 디버깅합니다.

T4 텍스트 템플릿 쓰기

런타임에 템플릿에서 문서를 생성합니다.

전처리 T4 텍스트 템플릿을 사용하여 런타임 텍스트 생성

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

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

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

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

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

T4 텍스트 변환 사용자 지정

참고 항목

기타 리소스

T4 텍스트 템플릿 작성 지침

변경 기록

날짜

변경 내용

이유

2010년 10월

VB 샘플을 추가했습니다.

지침을 별도의 항목으로 이동했습니다.

향상된 기능 관련 정보