다음을 통해 공유


MSBuild 인라인 작업

MSBuild 작업은 일반적으로 ITask 인터페이스를 구현하는 클래스를 컴파일하여 만듭니다. 자세한 내용은 MSBuild 작업을 참조하십시오.

.NET Framework 버전 4에서는 프로젝트 파일에서 인라인으로 작업을 만들 수 있습니다. 하지만 작업을 호스팅하는 별도의 어셈블리를 만들 필요는 없습니다. 이렇게 하면 보다 쉽게 소스 코드를 추적하고 작업을 배포할 수 있습니다. 소스 코드는 스크립트로 통합됩니다.

인라인 작업의 구조

인라인 작업은 UsingTask 요소에 포함됩니다. 인라인 작업 및 인라인 작업을 포함하는 UsingTask 요소는 일반적으로 .targets 파일에 들어 있으며 필요한 경우 다른 프로젝트 파일로 가져옵니다. 다음은 기본 인라인 작업이며 아무 작업도 수행하지 않습니다.

<Project ToolsVersion="12.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <!-- This simple inline task does nothing. -->
  <UsingTask
    TaskName="DoNothing"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll" >
    <ParameterGroup />
    <Task>
      <Reference Include="" />
      <Using Namespace="" />
      <Code Type="Fragment" Language="cs">
      </Code>
    </Task>
  </UsingTask>
</Project>

이 예제의 UsingTask 요소에는 작업 및 작업을 컴파일하는 인라인 작업 팩터리를 설명하는 세 개의 특성이 있습니다.

  • TaskName 특성은 작업의 이름(이 경우 DoNothing)을 지정합니다.

  • TaskFactory 특성은 인라인 작업 팩터리를 구현하는 클래스의 이름을 지정합니다.

  • AssemblyFile 특성은 인라인 작업 팩터리의 위치를 지정합니다. 또는 AssemblyName 특성을 사용하여 일반적으로 GAC(전역 어셈블리 캐시)에 위치하는 인라인 작업 팩터리 클래스의 정규화된 이름을 지정할 수 있습니다.

DoNothing 작업의 남아 있는 요소는 비어 있으며 인라인 작업의 순서 및 구조를 설명하는 데 제공됩니다. 이 항목의 뒷부분에 보다 강력한 예제가 제공됩니다.

  • ParameterGroup 요소는 선택적 항목입니다. 이 요소가 지정되면 작업에 대한 매개 변수를 선언합니다. 입력 및 출력 매개 변수에 대한 자세한 내용은 이 항목의 뒷부분에 나오는 "입력 및 출력 매개 변수"를 참조하십시오.

  • Task 요소는 작업 소스 코드를 설명하고 포함합니다.

  • Reference 요소는 코드에서 사용하고 있는 .NET 어셈블리에 대한 참조를 지정합니다. 이는 Visual Studio에서 프로젝트에 대한 참조를 추가하는 것과 같습니다. Include 특성은 참조된 어셈블리의 경로를 지정합니다.

  • Using 요소는 액세스할 네임스페이스를 나열합니다. 이 요소는 Visual C#의 Using 문과 비슷합니다. Namespace 특성은 포함할 네임스페이스를 지정합니다.

Reference 및 Using 요소는 언어와 무관합니다. 인라인 작업은 지원되는 NET CodeDom (예를 들어 Visual Baisc 또는 Visual C#) 언어중 하나로 작성 될 수 있습니다.

참고

Task 요소에 포함된 요소는 작업 팩터리(이 경우 코드 작업 팩터리)와 관련되어 있습니다.

코드 요소

Task 요소 내에 나타나는 마지막 자식 요소는 Code 요소입니다. Code 요소는 작업으로 컴파일할 코드를 포함하거나 찾습니다. Code 요소에 배치할 항목은 작업 작성 방식에 따라 다릅니다.

Language 특성은 코드가 작성되는 언어를 지정합니다. 사용할 수 있는 값은 C#은 cs, Visual Baic은 vb 입니다.

Type 특성은 Code 요소에서 찾을 수 있는 코드 형식을 지정합니다.

  • Type 값이 Class인 경우 Code 요소에는 ITask 인터페이스에서 파생된 클래스에 대한 코드가 포함되어 있습니다.

  • Type 값이 Method인 경우 코드는 ITask 인터페이스의 Execute 메서드 재정의를 정의합니다.

  • Type 값이 Fragment인 경우 코드는 return 문의 시그니처가 아닌 Execute 메서드의 내용을 정의합니다.

코드 자체는 일반적으로 <![CDATA[ 표식과 ]]> 표식 사이에 표시됩니다. 코드가 CDATA 섹션에 있으므로 "<" 또는 ">"와 같은 예약 문자 이스케이프에 신경쓰지 않아도 됩니다.

또는 Code 요소의 Source 특성을 사용하여 작업 코드를 포함하는 파일의 위치를 지정할 수 있습니다. 소스 파일의 코드 형식은 Type 특성에서 지정해야 합니다. Source 특성이 있는 경우 Type의 기본값은 Class입니다. Source가 없는 경우 기본값은 Fragment입니다.

참고

소스 파일의 작업 클래스를 정의할 때 클래스 이름은 해당 UsingTask 요소의 TaskName 특성에 맞아야 합니다.

Hello World

다음은 보다 강력한 인라인 작업이며 HelloWorld 작업은 일반적으로 시스템 콘솔 또는 Visual Studio 출력 창인 기본 오류 로깅 장치에 "Hello, world!"를 표시합니다. 이 예제의 Reference 요소는 단지 설명을 위해서만 포함되었습니다.

<Project ToolsVersion="12.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <!-- This simple inline task displays "Hello, world!" -->
  <UsingTask
    TaskName="HelloWorld"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup />
    <Task>
      <Reference Include="System.Xml.dll"/>
      <Using Namespace="System"/>
      <Using Namespace="System.IO"/>
      <Code Type="Fragment" Language="cs">
<![CDATA[
// Display "Hello, world!"
Log.LogError("Hello, world!");
]]>
      </Code>
    </Task>
  </UsingTask>
</Project>

이름이 HelloWorld.targets인 파일에 HelloWorld 작업을 저장한 후 다음과 같이 프로젝트에서 해당 파일을 호출할 수 있습니다.

<Project ToolsVersion="4.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="HelloWorld.targets" />
  <Target Name="Hello">
    <HelloWorld />
  </Target>
</Project>

입력 및 출력 매개 변수

인라인 작업 매개 변수는 ParameterGroup 요소의 자식 요소입니다. 모든 매개 변수는 해당 매개 변수를 정의하는 요소의 이름을 사용합니다. 다음 코드에서는 Text 매개 변수를 정의합니다.

<ParameterGroup>
    <Text />
</ParameterGroup>

매개 변수는 다음과 같은 특성 중 하나 이상을 포함할 수 있습니다.

  • Required는 기본적으로 false인 선택적 특성입니다. true이면 매개 변수가 필요하며 작업을 호출하기 전에 매개 변수에 값을 지정해야 합니다.

  • ParameterType은 기본적으로 System.String인 선택적 특성입니다. 이 특성은 System.Convert.ChangeType을 사용하여 문자열로 변환되거나 문자열에서 변환될 수 있는 항목 또는 값인 정규화된 형식으로 설정할 수 있습니다. 즉, 외부 작업에 전달되거나 외부 작업에서 전달될 수 있는 형식으로 설정할 수 있습니다.

  • Output은 기본적으로 false인 선택적 특성입니다. true이면 Execute 메서드에서 반환하기 전에 매개 변수에 값을 지정해야 합니다.

다음 예제를 참조하십시오.

<ParameterGroup>
    <Expression Required="true" />
      <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
    <Tally ParameterType="System.Int32" Output="true" />
</ParameterGroup>

위 코드는 다음과 같은 세 개의 매개 변수를 정의합니다.

  • Expression은 System.String 형식의 필수 입력 매개 변수입니다.

  • Files는 필수 항목 목록 입력 매개 변수입니다.

  • Tally는 System.Int32 형식의 출력 매개 변수입니다.

Code 요소에 Fragment 또는 Method의 Type 특성이 있으면 모든 매개 변수에 대한 속성이 자동으로 생성됩니다. 그렇지 않은 경우 속성은 작업 소스 코드에 명시적으로 선언되며 해당 매개 변수 정의와 정확하게 일치해야 합니다.

예제

다음 인라인 작업은 제공된 파일 내의 모든 토큰을 제공된 값으로 바꿉니다.

<Project xmlns='https://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="12.0">

  <UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
    <ParameterGroup>
      <Path ParameterType="System.String" Required="true" />
      <Token ParameterType="System.String" Required="true" />
      <Replacement ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Code Type="Fragment" Language="cs"><![CDATA[
string content = File.ReadAllText(Path);
content = content.Replace(Token, Replacement);
File.WriteAllText(Path, content);

]]></Code>
    </Task>
  </UsingTask>

  <Target Name='Demo' >
    <TokenReplace Path="C:\Project\Target.config" Token="$MyToken$" Replacement="MyValue"/>
  </Target>
</Project>

참고 항목

작업

연습: 인라인 작업 만들기

개념

MSBuild 작업