MSBuild 인라인 작업MSBuild Inline Tasks

MSBuild 작업은 일반적으로 ITask 인터페이스를 구현하는 클래스를 컴파일하여 생성됩니다.MSBuild tasks are typically created by compiling a class that implements the ITask interface. 자세한 내용은 작업을 참조하세요.For more information, see Tasks.

.NET Framework 버전 4부터 프로젝트 파일에서 인라인으로 작업을 만들 수 있습니다.Starting in .NET Framework version 4, you can create tasks inline in the project file. 작업을 호스트할 별도의 어셈블리를 만들 필요가 없습니다.You do not have to create a separate assembly to host the task. 따라서 소스 코드를 추적하기 위해 더 쉽고 작업을 배포하기도 더 쉽습니다.This makes it easier to keep track of source code and easier to deploy the task. 소스 코드는 스크립트에 통합됩니다.The source code is integrated into the script.

인라인 작업의 구조The Structure of an Inline Task

인라인 작업은 UsingTask 요소에 의해 포함됩니다.An inline task is contained by a UsingTask element. 인라인 작업 및 이 작업을 포함하는 UsingTask 요소는 일반적으로 .targets 파일에 포함되며 필요할 때 다른 프로젝트 파일로 가져옵니다.The inline task and the UsingTask element that contains it are typically included in a .targets file and imported into other project files as required. 다음은 기본 인라인 작업입니다.Here is a basic inline task. 이 작업은 아무 것도 수행하지 않습니다.Notice that it does nothing.

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

이 예제의 UsingTask 요소에는 작업 및 해당 작업을 컴파일하는 인라인 작업 팩터리를 설명하는 세 가지 특성이 있습니다.The UsingTask element in the example has three attributes that describe the task and the inline task factory that compiles it.

  • TaskName 특성은 작업의 이름을 지정합니다(이 경우 DoNothing).The TaskName attribute names the task, in this case, DoNothing.

  • TaskFactory 특성은 인라인 작업 팩터리를 구현하는 클래스의 이름을 지정합니다.The TaskFactory attribute names the class that implements the inline task factory.

  • AssemblyFile 특성은 인라인 작업 팩터리를 위치를 지정합니다.The AssemblyFile attribute gives the location of the inline task factory. 또는 AssemblyName 특성을 사용하여 일반적으로 GAC(전역 어셈블리 캐시)에 있는 인라인 작업 팩터리 클래스의 정규화된 이름을 지정할 수 있습니다.Alternatively, you can use the AssemblyName attribute to specify the fully qualified name of the inline task factory class, which is typically located in the global assembly cache (GAC).

    DoNothing 작업의 나머지 요소는 비어 있으며 인라인 작업의 순서 및 구조를 보여 주기 위해 제공됩니다.The remaining elements of the DoNothing task are empty and are provided to illustrate the order and structure of an inline task. 이 항목의 뒷부분에 보다 강력한 예제가 제공됩니다.A more robust example is presented later in this topic.

  • ParameterGroup 요소는 선택적입니다.The ParameterGroup element is optional. 이 요소를 지정하면 작업에 대한 매개 변수를 선언합니다.When specified, it declares the parameters for the task. 입력 및 출력 매개 변수에 대한 자세한 내용은 이 항목 뒷부분에 나오는 "입력 및 출력 매개 변수"를 참조하세요.For more information about input and output parameters, see "Input and Output Parameters" later in this topic.

  • Task 요소는 작업 소스 코드를 설명하고 포함합니다.The Task element describes and contains the task source code.

  • Reference 요소는 코드에서 사용하는 .NET 어셈블리에 대한 참조를 지정합니다.The Reference element specifies references to the .NET assemblies that you are using in your code. 이 요소를 사용하는 것은 Visual Studio에서 프로젝트에 대한 참조를 추가하는 것과 같습니다.This is equivalent to adding a reference to a project in Visual Studio. Include 특성은 참조된 어셈블리의 경로를 지정합니다.The Include attribute specifies the path of the referenced assembly.

  • Using 요소는 액세스하려는 네임스페이스를 나열합니다.The Using element lists the namespaces that you want to access. 이 요소는 Visual C#의 Using 문과 비슷합니다.This resembles the Using statement in Visual C#. Namespace 특성은 포함할 네임스페이스를 지정합니다.The Namespace attribute specifies the namespace to include.

    ReferenceUsing 요소는 언어와 관련이 없습니다.Reference and Using elements are language-agnostic. 인라인 작업은 지원되는 .NET CodeDom 언어 중 하나(예: Visual Basic 또는 Visual C#)로 작성할 수 있습니다.Inline tasks can be written in any one of the supported .NET CodeDom languages, for example, Visual Basic or Visual C#.

참고

Task 요소에 의해 포함된 요소는 작업 팩터리(이 경우 코드 작업 팩터리)마다 고유합니다.Elements contained by the Task element are specific to the task factory, in this case, the code task factory.

Code 요소Code Element

Task 요소 내에 마지막으로 나타나는 자식 요소는 Code 요소입니다.The last child element to appear within the Task element is the Code element. Code 요소는 작업으로 컴파일하려는 코드를 포함하거나 이러한 코드를 찾습니다.The Code element contains or locates the code that you want to be compiled into a task. Code 요소에 포함하는 내용은 작업을 작성하려는 방법에 따라 다릅니다.What you put in the Code element depends on how you want to write the task.

Language 특성은 코드가 작성된 언어를 지정합니다.The Language attribute specifies the language in which your code is written. 허용되는 값은 C#의 경우 cs, Visual Basic의 경우 vb입니다.Acceptable values are cs for C#, vb for Visual Basic.

Type 특성은 Code 요소에서 발견되는 코드의 형식을 지정합니다.The Type attribute specifies the type of code that is found in the Code element.

  • Type 값이 Class이면 Code 요소는 ITask 인터페이스에서 파생되는 클래스에 대한 코드를 포함합니다.If the value of Type is Class, then the Code element contains code for a class that derives from the ITask interface.

  • Type 값이 Method이면 코드는 ITask 인터페이스의 Execute 메서드에 대한 재정의를 정의합니다.If the value of Type is Method, then the code defines an override of the Execute method of the ITask interface.

  • Type 값이 Fragment이면 코드는 서명 또는 return 문이 아니라 Execute 메서드의 내용을 정의합니다.If the value of Type is Fragment, then the code defines the contents of the Execute method, but not the signature or the return statement.

    코드 자체는 일반적으로 <![CDATA[ 표식 및 ]]> 표식 사이에 나타납니다.The code itself typically appears between a <![CDATA[ marker and a ]]> marker. 코드가 CDATA 섹션에 있으므로 "<" 또는 ">"와 같은 예약 문자 이스케이프에 신경쓰지 않아도 됩니다.Because the code is in a CDATA section, you do not have to worry about escaping reserved characters, for example, "<" or ">".

    또는 Code 요소의 Source 특성을 사용하여 작업에 대한 코드를 포함하는 파일의 위치를 지정할 수 있습니다.Alternatively, you can use the Source attribute of the Code element to specify the location of a file that contains the code for your task. 소스 파일의 코드는 Type 특성으로 지정된 형식이어야 합니다.The code in the source file must be of the type that is specified by the Type attribute. Source 특성이 있으면 Type의 기본값은 Class입니다.If the Source attribute is present, the default value of Type is Class. Source가 없으면 기본값은 Fragment입니다.If Source is not present, the default value is Fragment.

참고

소스 파일에서 클래스 이름을 정의할 때 클래스 이름은 UsingTask 요소의 TaskName 특성에 부합되어야 합니다.When defining the task class in the source file, the class name must agree with the TaskName attribute of the corresponding UsingTask element.

Hello WorldHello World

다음은 좀 더 강력한 인라인 작업입니다.Here is a more robust inline task. HelloWorld 작업은 일반적으로 시스템 콘솔 또는The HelloWorld task displays "Hello, world!" Visual Studio 출력 창에 해당하는 기본 오류 로깅 장치에 "Hello, world!"를 표시합니다.on the default error logging device, which is typically the system console or the Visual Studio Output window. 이 예제의 Reference 요소는 단지 설명을 위해 포함되었습니다.The Reference element in the example is included just for illustration.

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  <!-- This simple inline task displays "Hello, world!" -->  
  <UsingTask  
    TaskName="HelloWorld"  
    TaskFactory="CodeTaskFactory"  
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.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 작업을 저장하고 다음과 같이 프로젝트에서 호출할 수 있습니다.You could save the HelloWorld task in a file that is named HelloWorld.targets, and then invoke it from a project as follows.

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

입력 및 출력 매개 변수Input and Output Parameters

인라인 작업 매개 변수는 ParameterGroup 요소의 자식 요소입니다.Inline task parameters are child elements of a ParameterGroup element. 모든 매개 변수는 해당 매개 변수를 정의하는 요소의 이름을 사용합니다.Every parameter takes the name of the element that defines it. 다음 코드는 매개 변수 Text를 정의합니다.The following code defines the parameter Text.

<ParameterGroup>  
    <Text />  
</ParameterGroup>  

매개 변수는 다음과 같은 특성을 하나 이상 포함할 수 있습니다.Parameters may have one or more of these attributes:

  • Required는 기본적으로 false인 선택적 특성입니다.Required is an optional attribute that is false by default. true이면 매개 변수는 필수이며 작업을 호출하기 전에 값을 지정해야 합니다.If true, then the parameter is required and must be given a value before calling the task.

  • ParameterType는 기본적으로 System.String인 선택적 특성입니다.ParameterType is an optional attribute that is System.String by default. System.Convert.ChangeType을 사용하여 특정 문자열로 변환되거나 이러한 문자열에서 변환될 수 있는 항목 또는 값에 해당하는 어떤 정규화된 형식으로도 설정될 수 있습니다.It may be set to any fully qualified type that is either an item or a value that can be converted to and from a string by using System.Convert.ChangeType. (즉, 외부 작업과 주고받을 수 있는 모든 형식을 나타냅니다.)(In other words, any type that can be passed to and from an external task.)

  • Output는 기본적으로 false인 선택적 특성입니다.Output is an optional attribute that is false by default. true이면 먼저 매개 변수에 값이 지정되어야 Execute 메서드에서 반환될 수 있습니다.If true, then the parameter must be given a value before returning from the Execute method.

    예를 들면 다음과 같습니다.For example,

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

다음과 같은 세 개의 매개 변수를 정의합니다.defines these three parameters:

  • Expression은 System.String 형식의 필수 입력 매개 변수입니다.Expression is a required input parameter of type System.String.

  • Files는 필수 항목 목록 입력 매개 변수입니다.Files is a required item list input parameter.

  • Tally는 System.Int32 형식의 출력 매개 변수입니다.Tally is an output parameter of type System.Int32.

    Code 요소에 Fragment 또는 MethodType 특성이 있는 경우 모든 매개 변수에 대해 자동으로 속성이 만들어집니다.If the Code element has the Type attribute of Fragment or Method, then properties are automatically created for every parameter. 그렇지 않으면 작업 소스 코드에서 속성을 명시적으로 선언해야 하며 이러한 속성은 해당 매개 변수 정의와 정확히 일치해야 합니다.Otherwise, properties must be explicitly declared in the task source code, and must exactly match their parameter definitions.

예제Example

다음 인라인 작업은 지정된 파일에서 나오는 모든 토큰을 지정된 값으로 바꿉니다.The following inline task replaces every occurrence of a token in the given file with the given value.

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

  <UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.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>  

참고 항목See Also

작업 Tasks
연습: 인라인 작업 만들기Walkthrough: Creating an Inline Task