MSBuild 대상
업데이트: 2007년 11월
대상은 작업을 특정한 순서로 그룹화하며 빌드 프로세스의 섹션이 명령줄에서 호출되도록 할 수 있습니다. 대상은 대개 논리적 섹션으로 그룹화되어 프로젝트 파일 확장을 허용하며 가독성을 향상시킵니다. 예를 들어, 한 대상에서 출력 디렉터리의 모든 파일을 삭제하여 빌드를 준비하는 동안 다른 대상에서는 프로젝트의 입력을 컴파일한 다음 빈 디렉터리에 넣을 수 있습니다.
프로젝트 파일에서 대상 선언
Target 요소를 사용하여 프로젝트 파일에 대상을 선언합니다. 예를 들어, 다음 XML은 Compile이라는 대상을 만들며, 이 대상은 Compile 항목 컬렉션에 대해 Csc 작업을 호출합니다.
<Target Name="Compile>
<Csc Sources="@(Compile)" />
</Target>
대상은 또한 Condition 특성을 사용할 수 있습니다. 지정한 조건이 false로 확인되면 대상이 실행되지 않고 MSBuild 엔진도 DependsOnTargets 특성에 지정된 대상을 실행하지 않습니다. 조건에 대한 자세한 내용은 MSBuild 조건을 참조하십시오.
종속성 분석
보다 수준 높은 시나리오에서는 대상이 서로의 관계를 설명하고 종속성 분석을 수행할 수 있습니다. 종속성 분석을 통해 대상이 최신 상태가 아닐 경우 빌드 프로세스의 전체 섹션을 건너뛸 수 있습니다. DependsOnTargets 특성을 사용하여 특정 대상 전에 실행되어야 하는 대상을 선언할 수 있습니다. 대상이 실행될 때 MSBuild 엔진은 우선 이 특성에 나열된 모든 대상을 자동으로 실행합니다. 자세한 내용은 방법: 증분 빌드를 참조하십시오.
![]() |
---|
대상은 단일 빌드에서 두 번 실행되지 않습니다. 대상이 일단 실행되면 해당 작업이 완료된 것으로 간주하므로 빌드의 후속 대상이 이미 실행된 대상에 종속되더라도 다시 실행되지 않습니다. |
최선의 구현 방법
프로젝트 파일을 이런 식으로 나누면 다른 섹션에 영향을 주지 않고 파일 섹션을 변경할 수 있습니다. 예를 들어, 리소스를 사용하는 프로젝트를 빌드하는 한 가지 방법은 GenerateResource 및 Csc 작업을 같은 대상에 넣는 것입니다. 예를 들면 다음과 같습니다.
<Target Name="Build">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
이 방법을 사용하면 프로젝트는 원하는 대로 빌드되지만 대상이 커지고 유연성이 없게 됩니다. 나중에 GenerateResource 및 Csc 사이에 다른 작업을 추가하려는 경우 모든 작업을 하나의 대상에 넣으면 프로젝트 파일은 읽기가 매우 어려워집니다. 또한, 증분 빌드에서는 전에 빌드된 적이 없는 대상이나 최신 상태가 아닌 대상만 다시 빌드하므로, 이와 같이 작업이 아주 많은 큰 대상을 작성하면 적합한 증분 빌드를 수행하기가 어려워집니다. 대상이 커지면 또한 특정 작업을 수행하는 대상은 실행되지 못합니다. 위의 예에서 컴파일하지 않고 리소스를 생성하는 방법은 없습니다.
프로젝트 파일을 작성하는 더 좋은 방법은 여러 대상을 사용하고 대상 간 종속성을 명확하게 표현하는 것입니다. 또한 이 방법을 사용하면 대상을 각각 독립적으로 실행할 수 있으므로, 빌드할 때마다 한 대상에 있는 긴 작업 목록을 실행하는 대신 보다 적은 일련의 작업을 수행할 수 있습니다. 이 예제에서 각 작업은 독립된 대상에 있으며, DependsOnTargets 특성은 Build 대상을 실행하기 전에 Resources 대상을 실행하도록 지정합니다.
<Target Name="Resources">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
</Target>
<Target Name="Build" DependsOnTargets="Resources">
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>