작업 작성Task Writing

작업은 빌드 프로세스 동안 실행되는 코드를 제공합니다.Tasks provide the code that runs during the build process. 작업은 대상에 포함되어 있습니다.Tasks are contained in targets. 일반적인 작업의 라이브러리는 MSBuildMSBuild에 포함되어 있으며 사용자 고유의 작업을 만들 수도 있습니다.A library of typical tasks is included with MSBuildMSBuild, and you can also create your own tasks. MSBuildMSBuild에 포함된 작업의 라이브러리에 대한 자세한 내용은 작업 참조를 참조하세요.For more information about the library of tasks that are included with MSBuildMSBuild, see Task Reference.

작업Tasks

작업의 예에는 하나 이상의 파일을 복사하는 Copy, 디렉터리를 만드는 MakeDir, Visual C#Visual C# 소스 코드 파일을 컴파일하는 Csc가 포함되어 있습니다.Examples of tasks include Copy, which copies one or more files, MakeDir, which creates a directory, and Csc, which compiles Visual C#Visual C# source code files. 각 작업은 ITask 인터페이스를 구현하는 .NET 클래스로 구현됩니다. 이 인터페이스는 Microsoft.Build.Framework.dll 어셈블리에서 정의됩니다.Each task is implemented as a .NET class that implements the ITask interface, which is defined in the Microsoft.Build.Framework.dll assembly.

작업을 구현할 때 다음 두 가지 방법을 사용할 수 있습니다.There are two approaches you can use when implementing a task:

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

  • 도우미 클래스 Task에서 클래스를 파생합니다. 이 클래스는 Microsoft.Build.Utilities.dll 어셈블리에서 정의됩니다.Derive your class from the helper class, Task, which is defined in the Microsoft.Build.Utilities.dll assembly. 작업은 ITask를 구현하고 일부 ITask 멤버의 기본 구현을 제공합니다.Task implements ITask and provides default implementations of some ITask members. 또한 로깅이 쉽습니다.Additionally, logging is easier.

    두 경우 모두 작업이 실행될 때 호출되는 방법인 Execute라는 메서드를 클래스에 추가해야 합니다.In both cases, you must add to your class a method named Execute, which is the method that is called when the task runs. 이 메서드는 매개 변수를 사용하지 않으며 Boolean 값을 반환합니다. 작업이 성공하는 경우 true, 실패하는 경우 false를 반환합니다.This method takes no parameters and returns a Boolean value: true if the task succeeded or false if it failed. 다음 예제는 아무 작업도 수행하지 않고 true를 반환하는 작업을 보여 줍니다.The following example shows a task that performs no action and returns true.

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

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

다음 프로젝트 파일은 이 작업을 실행합니다.The following project file runs this task:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <Target Name="MyTarget">  
        <SimpleTask />  
    </Target>  
</Project>  

작업이 실행될 때 작업 클래스에서 .NET 속성을 만드는 경우 프로젝트 파일에서 입력을 받을 수도 있습니다.When tasks run, they can also receive inputs from the project file if you create .NET properties on the task class. MSBuildMSBuild은(는) 작업의 Execute 메서드를 호출하기 바로 전에 이러한 속성을 설정합니다. sets these properties immediately before calling the task's Execute method. 문자열 속성을 만들려면 다음과 같은 작업 코드를 사용합니다.To create a string property, use task code such as:

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

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

        private string myProperty;  
        public string MyProperty  
        {  
            get { return myProperty; }  
            set { myProperty = value; }  
        }  
    }  
}  

다음 프로젝트 파일은 이 작업을 실행하고 MyProperty를 지정된 값으로 설정합니다.The following project file runs this task and sets MyProperty to the given value:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
   <Target Name="MyTarget">  
      <SimpleTask MyProperty="Value for MyProperty" />  
   </Target>  
</Project>  

작업 등록Registering Tasks

프로젝트가 작업을 실행하려는 경우 MSBuildMSBuild은(는) 작업 클래스를 포함하는 어셈블리를 찾는 방법을 알고 있어야 합니다.If a project is going to run a task, MSBuildMSBuild must know how to locate the assembly that contains the task class. 작업은 UsingTask 요소(MSBuild)를 사용하여 등록됩니다.Tasks are registered using the UsingTask Element (MSBuild).

MSBuildMSBuild 파일 Microsoft.Common.Tasks는 MSBuildMSBuild와(과) 함께 제공된 모든 작업을 등록하는 UsingTask 요소의 목록을 포함하는 프로젝트 파일입니다.The MSBuildMSBuild file Microsoft.Common.Tasks is a project file that contains a list of UsingTask elements that register all the tasks that are supplied with MSBuildMSBuild. 이 파일은 모든 프로젝트를 빌드할 때 자동으로 포함됩니다.This file is automatically included when building every project. Microsoft.Common.Tasks에 등록된 작업이 현재 프로젝트 파일에도 등록된 경우 현재 프로젝트 파일이 우선 순위를 가집니다. 즉, 동일한 이름을 가진 고유 작업으로 기본 작업을 재정의할 수 있습니다.If a task that is registered in Microsoft.Common.Tasks is also registered in the current project file, the current project file takes precedence; that is, you can override a default task with your own task that has the same name.

Microsoft.Common.Tasks의 내용을 확인하여 MSBuildMSBuild와(과) 함께 제공되는 작업의 목록을 볼 수 있습니다.You can see a list of the tasks that are supplied with MSBuildMSBuild by viewing the contents of Microsoft.Common.Tasks.

작업에서 이벤트 발생시키기Raising Events from a Task

작업이 Task 도우미 클래스에서 파생되는 경우 Task 클래스의 다음 도우미 클래스 중 하나를 사용하여 모든 등록된 로커로 발견되고 등록되는 이벤트를 발생시킬 수 있습니다.If your task derives from the Task helper class, you can use any of the following helper methods on the Task class to raise events that will be caught and displayed by any registered loggers:

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

작업이 ITask를 직접 구현하는 경우 이러한 이벤트를 여전히 발생시킬 수 있지만 IBuildEngine 인터페이스를 사용해야 합니다.If your task implements ITask directly, you can still raise such events but you must use the IBuildEngine interface. 다음 예제는 ITask를 구현하고 사용자 지정 이벤트를 발생시키는 작업을 보여 줍니다.The following example shows a task that implements ITask and raises a custom event:

public class SimpleTask : ITask  
{  
    private IBuildEngine buildEngine;  
    public IBuildEngine BuildEngine  
    {  
        get{ return buildEngine; }  
        set{ buildEngine = value; }  
    }  

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

설정하는 데 필요한 작업 매개 변수Requiring Task Parameters to be Set

작업을 실행하는 모든 프로젝트 파일이 이러한 속성의 값을 설정해야 할 수 있도록 특정 작업 속성을 "required"로 표시할 수 있습니다. 그렇지 않으면 빌드가 실패합니다.You can mark certain task properties as "required" so that any project file that runs the task must set values for these properties or the build fails. [Required] 특성을 다음과 같이 작업의 .NET 속성에 적용합니다.Apply the [Required] attribute to the .NET property in your task as follows:

private string requiredProperty;  

[Required]  
public string RequiredProperty  
{  
    get { return requiredProperty; }  
    set { requiredProperty = value; }  
}  

[Required] 특성은 Microsoft.Build.Framework 네임스페이스에서 RequiredAttribute로 정의됩니다.The [Required] attribute is defined by RequiredAttribute in the Microsoft.Build.Framework namespace.

예제Example

설명Description

다음 Visual C#Visual C# 클래스는 Task 도우미 클래스에서 파생되는 작업을 보여 줍니다.This following Visual C#Visual C# class demonstrates a task deriving from the Task helper class. 이 작업은 성공했음을 나타내는 true를 반환합니다.This task returns true, indicating that it succeeded.

코드Code

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;  
        }  
    }  
}  

예제Example

설명Description

다음 Visual C#Visual C# 클래스는 ITask 인터페이스를 구현하는 작업을 보여 줍니다.This following Visual C#Visual C# class demonstrates a task implementing the ITask interface. 이 작업은 성공했음을 나타내는 true를 반환합니다.This task returns true, indicating that it succeeded.

코드Code

using System;  
using Microsoft.Build.Framework;  

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

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

            set  
            {  
                hostObject = value;  
            }  
        }  

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

예제Example

설명Description

Visual C#Visual C# 클래스는 Task 도우미 클래스에서 파생되는 작업을 보여 줍니다.This Visual C#Visual C# class demonstrates a task that derives from the Task helper class. 필수 문자열 속성이 있으며 등록된 모든 로거로 표시되는 이벤트를 발생시킵니다.It has a required string property, and raises an event that is displayed by all registered loggers.

코드Code

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;
		}
	}
}

예제Example

설명Description

다음 예제에서는 이전 예제 작업, SimpleTask3을 호출하는 프로젝트 파일을 보여 줍니다.The following example shows a project file invoking the previous example task, SimpleTask3.

코드Code

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <UsingTask TaskName="SimpleTask3.SimpleTask3"   
        AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>  

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

참고 항목See Also

작업 참조 Task Reference
작업 참조Task Reference