다음을 통해 공유


MSBuild에 대한 작업 작성

작업은 MSBuild 대상에 포함되며 빌드 프로세스 중에 실행되는 코드를 제공합니다. MSBuild에는 일반적인 작업의 라이브러리가 포함되어 있으며 사용자 고유의 작업을 만들 수도 있습니다. MSBuild에 포함된 작업 라이브러리에 대한 자세한 내용은 MSBuild 작업 참조를 참조하세요.

필수 조건

MSBuild를 사용하여 빌드하는 Visual Studio 프로젝트입니다.

작업

MSBuild 작업의 예로는 하나 이상의 파일을 복사하는 Copy, 디렉터리를 만드는 MakeDir, C# 소스 코드 파일을 컴파일하는 Csc 등이 있습니다. 각 작업은 ITask 어셈블리에 정의된 인터페이스를 구현하는 .NET 클래스로 구현됩니다.

작업을 구현할 때 다음 방법 중 하나를 사용할 수 있습니다.

  • ITask 인터페이스를 직접 구현합니다.

  • 도우미 클래스 Task에서 귀하의 클래스를 파생시키십시오. 이 클래스는 Microsoft.Build.Utilities.dll 어셈블리에 정의되어 있습니다. TaskITask 일부 ITask 멤버의 기본 구현을 구현하고 제공합니다. 로깅도 더 쉽습니다.

두 경우 모두 작업이 실행되면 호출되는 명명 Execute된 클래스에 메서드를 추가해야 합니다. 이 메서드는 매개 변수를 사용하지 않고 Boolean 값을 반환합니다. true 작업이 성공했는지 또는 실패한 경우 false. 다음 예제에서는 아무 작업도 수행하지 않고 성공적으로 완료되고 반환되는 작업을 보여 줍니다 true.

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace MyTasks
{
    public class SimpleTask : Task
    {
        public override bool Execute()
        {
            return true;
        }
    }
}

다음 MSBuild 프로젝트 파일은 이전 작업을 실행합니다.

<Project>
    <Target Name="MyTarget">
        <SimpleTask />
    </Target>
</Project>

태스크가 실행되면 작업 클래스에서 .NET 속성을 만드는 경우 프로젝트 파일에서 입력을 받을 수도 있습니다. MSBuild는 작업의 Execute 메서드를 호출하기 직전에 이러한 속성을 설정합니다. 문자열 속성을 만들려면 다음 예제와 같은 작업 코드를 사용합니다.

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace MyTasks
{
    public class SimpleTask : Task
    {
        public override bool Execute()
        {
            return true;
        }

        public string MyProperty { get; set; }
    }
}

다음 프로젝트 파일은 이 작업을 실행하고 지정된 값으로 설정합니다 MyProperty .

<Project>
   <Target Name="MyTarget">
      <SimpleTask MyProperty="Value for MyProperty" />
   </Target>
</Project>

MSBuild에서 작업을 호출하는 방법

MSBuild가 작업을 호출할 때 먼저 작업 클래스를 인스턴스화한 다음 프로젝트 파일의 작업 요소에 설정된 작업 매개 변수에 대해 해당 개체의 속성 setter를 호출합니다. 작업 요소에서 매개 변수를 지정하지 않거나 요소에 지정된 식이 빈 문자열로 평가되면 속성 setter가 호출되지 않습니다.

예를 들어 다음 프로젝트에서는 setter Input3 만 호출됩니다.

<Project>
 <Target Name="InvokeCustomTask">
  <CustomTask Input1=""
              Input2="$(PropertyThatIsNotDefined)"
              Input3="value3" />
 </Target>
</Project>

작업은 매개 변수 속성 setter 호출의 상대 순서에 따라 달라지지 않아야 합니다.

작업 매개 변수 형식

MSBuild는 기본적으로 string, bool, ITaskItem, 및 ITaskItem[] 유형의 속성을 처리합니다. 태스크에서 다른 형식의 매개 변수를 허용하는 경우, MSBuild는 모든 속성 및 항목 참조가 확장된 후 ChangeType에서 대상 형식으로 변환하기 위해 string를 호출합니다. 입력 매개 변수에 대한 변환이 실패하면 MSBuild는 오류를 내보내고 작업의 Execute() 메서드를 호출하지 않습니다.

작업 등록

작업을 실행하려면 MSBuild에서 작업 클래스가 포함된 어셈블리를 찾아서 실행하는 방법을 알고 있어야 합니다. 작업은 UsingTask 요소(MSBuild)를 사용하여 등록됩니다.

작업에 런타임에 특화된 종속성이 있는 경우, MSBuild가 Architecture 또는 Runtime 속성을 UsingTask 요소에 지정하여 특정 환경에서 작업을 실행하도록 지시해야 합니다. 자세한 내용은 UsingTask 특성 및 작업 매개 변수를 참조하세요.

MSBuild 파일 Microsoft.Common.tasksUsingTask 등록하는 요소를 나열 하는 프로젝트 파일입니다. 이 파일은 MSBuild가 프로젝트를 빌드할 때 자동으로 포함됩니다. Microsoft.Common.tasks에 등록된 작업도 현재 프로젝트 파일에 등록되어 있으면 현재 프로젝트 파일이 우선하므로 동일한 이름의 고유한 작업으로 기본 작업을 재정의할 수 있습니다.

Microsoft.Common.tasks 파일의 내용을 확인하여 특정 버전의 MSBuild와 함께 제공되는 작업 목록을 볼 수 있습니다.

작업 속성을 설정해야 합니다.

특정 작업 속성을 필요에 따라 표시할 수 있으므로 작업을 실행하는 모든 프로젝트 파일은 이러한 속성에 대한 값을 설정해야 합니다. 그렇지 않으면 빌드가 실패합니다. 다음과 같이 작업의 .NET 속성에 [Required] 특성을 적용합니다.

[Required]
public string RequiredProperty { get; set; }

[Required] 특성은 RequiredAttribute 네임스페이스의 Microsoft.Build.Framework 의해 정의됩니다.

작업에서 이벤트를 발생시키기

작업이 Task 도우미 클래스에서 파생된 경우, Task 클래스에서 다음과 같은 도우미 메서드를 사용하여 등록된 모든 로거가 캐치하고 표시할 수 있는 이벤트를 발생시킬 수 있습니다.

public override bool Execute()
{
    Log.LogError("messageResource1", "1", "2", "3");
    Log.LogWarning("messageResource2");
    Log.LogMessage(MessageImportance.High, "messageResource3");
    ...
}

ITask을 직접 구현하는 경우에도 이러한 이벤트를 발생시킬 수 있지만, IBuildEngine 인터페이스를 사용해야 합니다. 다음 예제는 ITask을(를) 구현하고 사용자 지정 이벤트를 발생시키는 작업을 보여 줍니다.

public class SimpleTask : ITask
{
    public IBuildEngine BuildEngine { get; set; }

    public override bool Execute()
    {
        TaskEventArgs taskEvent =
            new TaskEventArgs(BuildEventCategory.Custom,
            BuildEventImportance.High, "Important Message",
           "SimpleTask");
        BuildEngine.LogBuildEvent(taskEvent);
        return true;
    }
}

작업 패키지

작업을 배포하는 권장 방법은 NuGet 패키지에 있습니다. 패키지는 모든 종속성을 번들로 묶어야 합니다. 사용자 지정 작업을 만드는 방법에 대한 자습서는 NuGet 패키지 만들기를 참조하세요.

예제 1

다음 C# 클래스는 도우미 클래스에서 Task 파생되는 작업을 보여 줍니다. 이 작업은 성공했음을 나타내는 true반환합니다.

using System;
using Microsoft.Build.Utilities;

namespace SimpleTask1
{
    public class SimpleTask1: Task
    {
        public override bool Execute()
        {
            // This is where the task would presumably do its work.
            return true;
        }
    }
}

예제 2

다음 C# 클래스는 인터페이스를 구현하는 ITask 작업을 보여 줍니다. 이 작업은 성공했음을 나타내는 true반환합니다.

using System;
using Microsoft.Build.Framework;

namespace SimpleTask2
{
    public class SimpleTask2: ITask
    {
        //When implementing the ITask interface, it's necessary to
        //implement a BuildEngine property of type
        //Microsoft.Build.Framework.IBuildEngine. This is done for
        //you if you derive from the Task class.
        public IBuildEngine BuildEngine { get; set; }

        // When implementing the ITask interface, it's necessary to
        // implement a HostObject property of type object.
        // This is done for you if you derive from the Task class.
        public object HostObject { get; set; }

        public bool Execute()
        {
            // This is where the task does its work.
            return true;
        }
    }
}

예제 3

이 C# 클래스는 Task 도우미 클래스에서 파생되는 작업을 보여 줍니다. 태스크에는 필수 문자열 속성이 있으며 등록된 모든 로거에 의해 표시되는 이벤트가 발생합니다.

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace SimpleTask3
{
    public class SimpleTask3 : Task
    {
        private string myProperty;

        // The [Required] attribute indicates a required property.
        // If a project file invokes this task without passing a value
        // to this property, the build will fail immediately.
        [Required]
        public string MyProperty
        {
            get
            {
                return myProperty;
            }
            set
            {
                myProperty = value;
            }
        }

        public override bool Execute()
        {
            // Log a high-importance comment
            Log.LogMessage(MessageImportance.High,
                "The task was passed \"" + myProperty + "\".");
            return true;
        }
    }
}

예제 4

다음 예제에서는 이전 예제 작업을 SimpleTask3호출하는 프로젝트 파일을 보여 냅니다.

<Project>
    <UsingTask TaskName="SimpleTask3.SimpleTask3"
        AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>

    <Target Name="MyTarget">
        <SimpleTask3 MyProperty="Hello!"/>
    </Target>
</Project>