대상 및 작업 구성
선택한 MSBuild 작업은 개발 컴퓨터가 대상 환경을 지원할 때 대상 환경에서 실행되도록 설정할 수 있습니다. 예를 들어 64비트 Windows 컴퓨터를 사용하여 32비트 Windows 아키텍처를 대상으로 하는 애플리케이션을 빌드할 경우 선택한 작업은 32비트 프로세스에서 실행됩니다.
참고 항목
빌드 작업이 Visual C# 또는 Visual Basic 같은 .NET 언어로 작성되고 네이티브 리소스 또는 도구를 사용하지 않는 경우 조정 없이도 모든 대상 컨텍스트에서 실행됩니다.
UsingTask 특성 및 작업 매개 변수
다음 UsingTask
특성은 특정 빌드 프로세스에서 작업의 모든 작동에 영향을 줍니다.
Runtime
특성(있는 경우)은 CLR(공용 언어 런타임) 버전을 설정하고CLR2
,CLR4
,CurrentRuntime
또는*
(임의 런타임) 값 중 하나를 사용할 수 있습니다.Architecture
특성(있는 경우)은 플랫폼 및 비트를 설정하고x86
,x64
,CurrentArchitecture
또는*
(임의 아키텍처) 값 중 하나를 사용할 수 있습니다.TaskFactory
특성은(있는 경우) 작업 인스턴스를 만들고 실행하는 작업 팩터리를 설정하고 값TaskHostFactory
만 사용합니다. 자세한 내용은 이 문서 뒷부분에 나오는 작업 팩터리를 참조하세요.
<UsingTask TaskName="SimpleTask"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />
MSBuildRuntime
및 MSBuildArchitecture
매개 변수를 사용하여 개별 작업 호출의 대상 컨텍스트를 설정할 수도 있습니다.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
MSBuild가 작업을 실행하기 전에 동일한 대상 컨텍스트를 갖는 일치하는 UsingTask
를 찾습니다. UsingTask
에 지정되어 있으나 해당 작업에는 지정되지 않은 매개 변수는 일치하는 항목으로 간주됩니다. 작업에 지정되어 있으나 해당 UsingTask
에는 지정되지 않은 매개 변수도 일치하는 항목으로 간주됩니다. 매개 변수 값이 UsingTask
및 작업 둘 다에 지정되지 않은 경우 값의 기본값은 *
(임의 매개 변수)입니다.
Warning
둘 이상의 UsingTask
가 존재하며 모두 일치하는 TaskName
, Runtime
및 Architecture
특성을 갖는 경우 첫 번째로 평가되는 특성이 다른 특성을 대신합니다. 이는 Property
및 Target
요소의 동작과 다릅니다.
매개 변수가 작업에 설정되어 있으면 MSBuild는 이러한 매개 변수와 일치하거나 적어도 충돌하지 않는 UsingTask
를 찾으려고 합니다. 둘 이상의 UsingTask
는 동일한 작업의 대상 컨텍스트를 지정할 수 있습니다. 예를 들어, 대상 환경마다 다른 실행 파일을 갖는 작업은 다음과 비슷할 수 있습니다.
<UsingTask TaskName="MyTool"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
기본 UsingTasks 재정의
기본적으로 MSBuild는 UsingTask를 “첫 번째 승리”로 처리합니다. 17.2부터 MSBuild는 Override
매개 변수를 통해 이 동작을 재정의할 수 있습니다. 매개 변수 Override
가 true
로 설정된 UsingTask는 동일한 TaskName의 다른 UsingTask보다 우선합니다.
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
Override="true"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
Warning
이 작업은 작업당 한 번만 수행할 수 있습니다. 동일한 작업에 대해 여러 재정의를 추가하려는 빌드는 MSBuild 오류 MSB4275
를 수신합니다.
작업 팩터리
다음 표에서는 MSBuild 설치에서 제공하는 작업 팩터리를 보여줍니다.
작업 팩터리 | 설명 |
---|---|
AssemblyTaskFactory |
기본값입니다. In-Process 작업을 실행합니다. |
TaskHostFactory |
out-of-process 작업을 실행합니다. |
RoslynCodeTaskFactory |
C# 또는 Visual Basic으로 작성되고 .NET Standard를 대상으로 하는 인라인 작업의 경우 msbuild.exe 및 dotnet build 둘 다에서 작동합니다. |
CodeTaskFactory |
C# 또는 Visual Basic으로 작성되고 .NET Framework를 대상으로 하는 인라인 작업의 경우 msbuild.exe 에서만 작동합니다. |
작업 팩터리 메커니즘은 확장 가능하므로 타사에서 만든 메커니즘을 사용하거나 직접 만들 수도 있습니다. 직접 만드는 이유는 인라인 작업을 작성할 때 다른 언어를 지원하기 위한 것입니다.
TaskHostFactory
작업을 실행하기 전에 MSBuild는 작업이 현재 소프트웨어 컨텍스트에서 실행되도록 지정되어 있는지 여부를 확인합니다. 작업이 이렇게 지정된 경우 MSBuild는 작업을 현재 프로세스에서 실행하는 AssemblyTaskFactory
로 전달하고, 그렇지 않으면 대상 컨텍스트와 일치하는 프로세스에서 작업을 실행하는 TaskHostFactory
로 작업을 전달합니다. 현재 컨텍스트 및 대상 컨텍스트가 일치하더라도 TaskFactory
를 TaskHostFactory
로 설정하여 강제로 작업이 out-of-process로 실행되도록 할 수 있습니다(격리, 보안 또는 기타 이유로).
<UsingTask TaskName="MisbehavingTask"
TaskFactory="TaskHostFactory"
AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>
TaskHostFactory
이 명시적으로 지정된 경우 작업을 실행하는 프로세스는 수명이 짧습니다. 이렇게 하면 운영 체제가 실행 직후 작업과 관련된 모든 리소스를 정리할 수 있습니다. 이러한 이유로 빌드 후 작업 어셈블리를 업데이트할 때 파일 사용 오류를 방지하려면 사용과 동일한 빌드 프로세스에서 빌드된 작업을 참조할 때 TaskHostFactory
를 지정합니다.
RoslynCodeTaskFactory
RoslynCodeTaskFactory
는 프로젝트 파일에서 작업에 대한 C# 또는 Visual Basic 코드를 작성하고 즉시 사용할 수 있는 메커니즘을 제공합니다. 이 코드는 빌드 프로세스 중에 컴파일되어 동일한 빌드에서 실행 가능한 작업을 생성합니다. 작성하는 코드는 .NET Standard를 대상으로 하므로 MSBuild의 .NET Core(및 .NET 5 이상) 버전을 사용하는 dotnet build
및 .NET Framework를 사용하는 msbuild.exe
실행 시 사용 가능합니다. RoslynCodeTaskFactory
는 MSBuild 논리에서 너무 어렵지만 별도의 프로젝트를 만들 만큼 복잡하지 않은 사용자 지정에 가장 적합합니다. RoslynCodeTaskFactory로 MSBuild 인라인 작업 만들기를 참조하세요.
CodeTaskFactory
CodeTaskFactory
는 MSBuild의 .NET Framework 버전으로 제한되는 이전 버전의 RoslynCodeTaskFactory
입니다. MSBuild 인라인 작업을 참조하세요. 이 작업 팩터리는 지원되지만 더 광범위한 적용을 위해 최신 코드에서 RoslynCodeTaskFactory
를 사용해야 합니다.
가상 작업 매개 변수
다른 모든 작업 매개 변수와 마찬가지로 MSBuildRuntime
및 MSBuildArchitecture
는 빌드 속성에서 설정할 수 있습니다.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FrameworkVersion>3.0</FrameworkVersion>
</PropertyGroup>
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
</Target>
</Project>
다른 작업 매개 변수와 달리 MSBuildRuntime
및 MSBuildArchitecture
는 작업 자체에 표시되지 않습니다. 실행되는 컨텍스트를 인식하는 작업을 작성하려면 .NET Framework를 호출하여 컨텍스트를 테스트하거나 빌드 속성을 사용하여 다른 작업 매개 변수를 통해 컨텍스트 정보를 전달해야 합니다.
참고 항목
UsingTask
특성은 도구 집합 및 환경 속성에서 설정할 수 있습니다.
MSBuildRuntime
및 MSBuildArchitecture
매개 변수는 대상 컨텍스트 뿐만 아니라 가장 제한적인 범위를 설정하는 가장 유연한 방법을 제공합니다. 한편 이러한 매개 변수는 작업 인스턴스 자체에서 설정되고 작업이 실행된 다음에야 평가되기 때문에 평가 시간과 빌드 시간에 모두 사용할 수 있는 전체 범위의 속성에서 값을 파생시킬 수 있습니다. 반면 이러한 매개 변수는 특정 대상에 있는 특정 작업 인스턴스에만 적용됩니다.
참고 항목
작업 매개 변수는 작업 호스트의 컨텍스트가 아니라 부모 노드의 컨텍스트에서 평가됩니다. 런타임 종속적 또는 아키텍처 종속적 환경 변수(예: 프로그램 파일 위치)는 부모 노드와 일치하는 값으로 평가됩니다. 그러나 동일한 환경 변수를 작업에서 직접 읽을 경우 작업 호스트의 컨텍스트에서 올바르게 평가됩니다.