작업은 빌드 프로세스 동안 실행되는 코드를 제공합니다. 작업은 대상에 포함되어 있습니다. 일반적인 작업의 라이브러리는 MSBuild에 포함되어 있으며 사용자 고유의 작업을 만들 수도 있습니다. MSBuild에 포함된 작업의 라이브러리에 대한 자세한 내용은 작업 참조에서 확인하세요.
작업
작업의 예에는 하나 이상의 파일을 복사하는 Copy, 디렉터리를 만드는 MakeDir, C# 소스 코드 파일을 컴파일하는 Csc가 포함되어 있습니다. 각 작업은 ITask 인터페이스를 구현하는 .NET 클래스로 구현됩니다. 이 인터페이스는 Microsoft.Build.Framework.dll 어셈블리에서 정의됩니다.
도우미 클래스 Task에서 클래스를 파생시킵니다. 이 클래스는 Microsoft.Build.Utilities.dll 어셈블리에서 정의됩니다. 작업은 ITask를 구현하고 일부 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;
}
}
}
작업이 실행될 때 작업 클래스에서 .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; }
}
}
MSBuild 파일 Microsoft.Common.tasks는 MSBuild와 함께 제공된 모든 작업을 등록하는 UsingTask 요소의 목록을 포함하는 프로젝트 파일입니다. 이 파일은 모든 프로젝트를 빌드할 때 자동으로 포함됩니다. Microsoft.Common.tasks에 등록된 작업이 현재 프로젝트 파일에도 등록된 경우 현재 프로젝트 파일이 우선 순위를 가집니다. 따라서 동일한 이름을 가진 고유 작업으로 기본 작업을 재정의할 수 있습니다.
팁
Microsoft.Common.tasks의 내용을 확인하여 특정 버전의 MSBuild와 함께 제공되는 작업의 목록을 볼 수 있습니다.
작업에서 이벤트 발생
작업이 Task 도우미 클래스에서 파생되는 경우 Task 클래스의 다음 도우미 클래스 중 하나를 사용하여 모든 등록된 로커로 발견되고 등록되는 이벤트를 발생시킬 수 있습니다.
작업을 호출할 때 MSBuild는 먼저 작업 클래스를 인스턴스화한 다음, 프로젝트 파일의 작업 요소에 설정된 작업 매개 변수에 대해 해당 개체의 속성 setter를 호출합니다. 작업 요소가 매개 변수를 지정하지 않거나 요소에 지정된 식이 빈 문자열로 평가되는 경우에는 속성 setter가 호출되지 않습니다.
MSBuild는 기본적으로 string, bool, ITaskItem, ITaskItem[] 형식의 속성을 처리합니다. 작업이 다른 형식의 매개 변수를 허용하는 경우, MSBuild는 ChangeType을 호출하여 모든 속성 및 항목 참조가 펼쳐진 string에서 대상 형식으로 변환합니다. 변환에 실패한 입력 매개 변수가 하나라도 있으면 MSBuild는 오류를 내보내고 작업의 Execute() 메서드를 호출하지 않습니다.
작업 패키징
작업을 배포하는 권장 방법은 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 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.
public IBuildEngine BuildEngine { get; set; }
// 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.
public object HostObject { get; set; }
public bool Execute()
{
// This is where the task would presumably do 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을 호출하는 프로젝트 파일을 보여 줍니다.
Do you want to learn how to assign tasks to a project in Business Central? In this module, you learn how to create project task lines, which are necessary to post to a project.