다음을 통해 공유


연습: 인라인 작업 만들기

MSBuild 작업은 일반적으로 ITask 인터페이스를 구현하는 클래스를 컴파일하여 만듭니다. .NET Framework 버전 4부터 프로젝트 파일에서 인라인으로 작업을 만들 수 있습니다. 하지만 작업을 호스팅하는 별도의 어셈블리를 만들 필요는 없습니다. 자세한 내용은 MSBuild 인라인 작업을 참조하십시오.

이 연습에서는 다음과 같은 인라인 작업을 만들고 실행하는 방법을 보여 줍니다.

  • 입력 또는 출력 매개 변수가 없는 작업

  • 입력 매개 변수는 하나 있지만 출력 매개 변수가 없는 작업

  • 두 개의 입력 매개 변수와 MSBuild 속성을 반환하는 하나의 출력 매개 변수가 있는 작업

  • 두 개의 입력 매개 변수와 MSBuild 항목을 반환하는 하나의 출력 매개 변수가 있는 작업

작업을 만들고 실행하려면 다음과 같이 Visual Studio와 Visual Studio 명령 프롬프트 창을 사용합니다.

  • Visual Studio를 사용하여 MSBuild 프로젝트 파일을 만듭니다.

  • Visual Studio에서 프로젝트 파일을 수정하여 인라인 작업을 만듭니다.

  • 명령 프롬프트 창을 사용하여 프로젝트를 빌드하고 결과를 검토합니다.

MSBuild 프로젝트 만들기 및 수정

Visual Studio 프로젝트 시스템은 MSBuild를 기반으로 합니다. 따라서 Visual Studio를 사용하여 빌드 프로젝트 파일을 만들 수 있습니다. 이 단원에서는 Visual C# 프로젝트 파일을 만듭니다. 대신 Visual Basic 프로젝트 파일을 만들 수도 있습니다. 이 자습서의 컨텍스트에서는 이 두 프로젝트 파일 간의 차이가 그리 크지 않습니다.

프로젝트 파일을 만들고 수정하려면

  1. Visual Studio 파일 메뉴에서 새로 만들기를 클릭한 다음 프로젝트를 클릭합니다.

  2. 새 프로젝트 대화 상자에서 Visual C# 프로젝트 형식을 선택한 다음 Windows Forms 응용 프로그램 템플릿을 선택합니다. 이름 상자에 InlineTasks를 입력합니다. 솔루션에 대한 위치(예: D:\)를 입력합니다. 솔루션용 디렉터리 만들기가 선택되어 있고 소스 제어에 추가의 선택이 취소되어 있으며 솔루션 이름이 InlineTasks인지 확인합니다.

    확인을 클릭하여 프로젝트 파일을 만듭니다.

  3. 솔루션 탐색기에서 InlineTasks 프로젝트 노드를 마우스 오른쪽 단추로 클릭한 다음 프로젝트 언로드를 클릭합니다.

  4. 프로젝트 노드를 다시 마우스 오른쪽 단추로 클릭한 다음 InlineTasks.csproj 편집을 클릭합니다.

    프로젝트 파일이 코드 편집기에 나타납니다.

기본 Hello 작업 추가

이제 프로젝트 파일에 "Hello, world!"라는 메시지를 표시하는 기본 작업을 추가하고, 기본 TestBuild 대상을 추가하여 작업을 호출해 보겠습니다.

기본 Hello 작업을 추가하려면

  1. 루트 Project 노드에서 DefaultTargets 특성을 TestBuild로 변경합니다. 결과 Project 노드는 다음 예제와 같습니다.

    <Project ToolsVersion="4.0" DefaultTargets="TestBuild" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">

  2. 프로젝트 파일에서 </Project> 태그 바로 앞에 인라인 작업 및 대상을 추가합니다.

    <UsingTask TaskName="Hello" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup />
      <Task>
        <Code Type="Fragment" Language="cs">
          Log.LogMessage("Hello, world!", MessageImportance.High);
        </Code>
      </Task>
    </UsingTask>
    <Target Name="TestBuild">
      <Hello />
    </Target>
    
  3. 프로젝트 파일을 저장합니다.

이 코드에서는 매개 변수, 참조 또는 Using 문이 없는 Hello라는 인라인 작업을 만듭니다. Hello 작업에는 일반적으로 콘솔 창인 기본 로깅 장치에 Hello 메시지를 표시하는 코드 줄 하나만 포함됩니다.

Hello 작업 실행

명령 프롬프트 창을 통해 MSBuild를 실행하여 Hello 작업을 만들고 이 작업을 호출하는 TestBuild 대상을 처리합니다.

Hello 작업을 실행하려면

  1. 시작, 모든 프로그램을 차례로 클릭한 다음 Visual Studio 도구 폴더를 찾아 Visual Studio 명령 프롬프트를 클릭합니다.

  2. 명령 프롬프트 창에서 프로젝트 파일을 포함하는 폴더(이 경우에는 D:\InlineTasks\InlineTasks\)를 찾습니다.

  3. 명령 스위치 없이 msbuild를 입력하고 Enter 키를 누릅니다. 이렇게 하면 기본적으로 InlineTasks.csproj 파일이 빌드되고 기본 대상 TestBuild가 처리되어 Hello 작업이 호출됩니다.

  4. 명령 프롬프트 창에서 출력을 검토합니다. 다음과 같은 줄이 표시됩니다.

    Hello, world!

    참고

    Hello 메시지가 표시되지 않으면 프로젝트 파일을 다시 저장한 다음 Hello 작업을 실행해 보십시오.

코드 편집기와 명령 프롬프트 창을 오가면서 프로젝트 파일을 변경하고 결과를 신속하게 확인할 수 있습니다.

Echo 작업 정의

문자열 매개 변수를 사용하며 기본 로깅 장치에 문자열을 표시하는 인라인 작업을 만듭니다.

Echo 작업을 정의하려면

  1. 코드 편집기에서 Hello 작업 및 TestBuild 대상을 다음 코드로 바꿉니다.

    <UsingTask TaskName="Echo" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup>
        <Text Required="true" />
      </ParameterGroup>
      <Task>
        <Code Type="Fragment" Language="cs">
          Log.LogMessage(Text, MessageImportance.High);
        </Code>
      </Task>
    </UsingTask>
    <Target Name="TestBuild">
      <Echo Text="Greetings!" />
    </Target>
    
  2. 명령 프롬프트 창에서 명령 스위치 없이 msbuild를 입력하고 Enter 키를 누릅니다. 이렇게 하면 기본적으로 기본 대상 TestBuild가 처리되어 Adder 작업이 호출됩니다.

  3. 명령 프롬프트 창에서 출력을 검토합니다. 다음과 같은 줄이 표시됩니다.

    Greetings!

이 코드에서는 Text라는 필수 입력 매개 변수 하나만 있는 Echo라는 인라인 작업을 정의합니다. 기본적으로 매개 변수는 System.String 형식입니다. Text 매개 변수의 값은 TestBuild 대상이 Echo 작업을 호출할 때 설정됩니다.

Adder 작업 정의

두 개의 정수 매개 변수를 더해 합계를 MSBuild 속성으로 내보내는 인라인 작업을 만듭니다.

Adder 작업을 정의하려면

  1. 코드 편집기에서 Echo 작업 및 TestBuild 대상을 다음 코드로 바꿉니다.

    <UsingTask TaskName="Adder" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup>
        <A ParameterType="System.Int32" Required="true" />
        <B ParameterType="System.Int32" Required="true" />
        <C ParameterType="System.Int32" Output="true" />
      </ParameterGroup>
      <Task>
        <Code Type="Fragment" Language="cs">
          C = A + B;
        </Code>
      </Task>
    </UsingTask>  
    <Target Name="TestBuild">
      <Adder A="4" B="5">
        <Output PropertyName="Sum" TaskParameter="C" />
      </Adder>
      <Message Text="The sum is $(Sum)" Importance="High" />
    </Target>
    
  2. 명령 프롬프트 창에서 명령 스위치 없이 msbuild를 입력하고 Enter 키를 누릅니다. 이렇게 하면 기본적으로 기본 대상 TestBuild가 처리되어 Adder 작업이 호출됩니다.

  3. 명령 프롬프트 창에서 출력을 검토합니다. 다음과 같은 줄이 표시됩니다.

    The sum is 9

이 코드에서는 A와 B라는 필수 정수 입력 매개 변수 두 개와 C라는 정수 출력 매개 변수 하나가 있는 Adder라는 인라인 작업을 정의합니다. Adder 작업은 두 입력 매개 변수를 더해 출력 매개 변수에 합계를 반환합니다. 합계는 MSBuild 속성 Sum으로 내보내집니다. 입력 매개 변수의 값은 TestBuild 대상이 Adder 작업을 호출할 때 설정됩니다.

RegX 작업 정의

항목 그룹 및 정규식을 사용하며 이 식과 일치하는 파일 내용을 포함하는 모든 항목의 목록을 반환하는 인라인 작업을 만듭니다.

RegX 작업을 정의하려면

  1. 코드 편집기에서 Adder 작업 및 TestBuild 대상을 다음 코드로 바꿉니다.

    <UsingTask TaskName="RegX" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup>
        <Expression Required="true" />
        <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
        <Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
      </ParameterGroup>
      <Task>
        <Using Namespace="System.Text.RegularExpressions"/>
        <Code Type="Fragment" Language="cs">
    <![CDATA[
          if (Files.Length > 0)
          {
            Result = new TaskItem[Files.Length];
            for (int i = 0; i < Files.Length; i++)
            {
              ITaskItem item = Files[i];
              string path = item.GetMetadata("FullPath");
              using(StreamReader rdr = File.OpenText(path))
              {
                if (Regex.Match(rdr.ReadToEnd(), Expression).Success)
                {
                  Result[i] = new TaskItem(item.ItemSpec);
                }
              }
            }
          }
    ]]>
        </Code>
      </Task>
    </UsingTask>  
    <Target Name="TestBuild">
      <RegX Expression="public|protected" Files="@(Compile)">
        <Output ItemName="MatchedFiles" TaskParameter="Result" />
      </RegX>
      <Message Text="Input files: @(Compile)" Importance="High" />
      <Message Text="Matched files: @(MatchedFiles)" Importance="High" />
    </Target>
    
  2. 명령 프롬프트 창에서 명령 스위치 없이 msbuild를 입력하고 Enter 키를 누릅니다. 이렇게 하면 기본적으로 기본 대상 TestBuild가 처리되어 RegX 작업이 호출됩니다.

  3. 명령 프롬프트 창에서 출력을 검토합니다. 다음과 같은 줄이 표시됩니다.

    Input files: Form1.cs;Form1.Designer.cs;Program.cs;Properties\AssemblyInfo.cs;Properties\Resources.Designer.cs;Properties\Settings.Designer.cs

    Matched files: Form1.cs;Form1.Designer.cs;Properties\Settings.Designer.cs

이 코드에서는 다음과 같은 세 가지 매개 변수가 있는 RegX라는 인라인 작업을 정의합니다.

  • Expression은 일치 여부를 확인할 정규식을 값으로 포함하는 필수 문자열 입력 매개 변수입니다. 이 예제에서 정규식은 "public" 또는 "protected"라는 단어와 일치합니다.

  • Files는 일치 여부를 확인하기 위해 검색할 파일의 목록을 값으로 포함하는 필수 항목 목록 입력 매개 변수입니다. 이 예제에서는 Files가 프로젝트 소스 파일을 나열하는 Compile 항목으로 설정됩니다.

  • Result는 정규식과 일치하는 내용이 들어 있는 파일의 목록을 값으로 포함하는 출력 매개 변수입니다.

입력 매개 변수의 값은 TestBuild 대상이 RegX 작업을 호출할 때 설정됩니다. RegX 작업은 모든 파일을 읽어 정규식과 일치하는 파일의 목록을 반환합니다. 이 목록은 MSBuild 항목 MatchedFiles로 내보내지는 Result 출력 매개 변수로 반환됩니다.

예약된 문자 처리

MSBuild 파서는 인라인 작업을 XML로 처리합니다. "<" 및 ">"와 같이 XML에서 예약된 의미가 있는 문자는 발견될 경우 .NET 소스 코드가 아니라 XML처럼 처리됩니다. Files.Length > 0과 같이 예약된 문자를 코드 식에 포함하려면 내용이 CDATA 식에 포함되도록 다음과 같이 Code 요소를 작성합니다.

<Code Type="Fragment" Language="cs">

<![CDATA[

// Your code goes here.

]]>

</Code>

참고 항목

개념

MSBuild 인라인 작업

MSBuild 작업

MSBuild 대상