대규모 프로젝트를 빌드할 때 아직 up-to빌드된 대상은 다시 빌드하지 않는 것이 중요합니다. 모든 대상이 매번 빌드되는 경우 각 빌드를 완료하는 데 시간이 오래 걸릴 수 있습니다.
증분 빌드에서는 프로젝트의 아직 빌드되지 않은 대상이나 오래된 대상만 빌드됩니다. MSBuild(Microsoft Build Engine)는 입력 파일의 타임스탬프를 출력 파일의 타임스탬프와 비교합니다. MSBuild는 각 대상을 건너뛰거나 빌드하거나 부분적으로 다시 빌드할지 여부를 결정합니다.
증분 빌드 프로세스에는 대상에 대한 입력과 출력 간의 일대일 매핑이 필요합니다. 변환을 사용하여 대상이 입력-ouput 매핑을 식별할 수 있도록 설정할 수 있습니다. 자세한 내용은 변환을 참조하십시오.
입력 및 출력 지정
MSBuild는 대상의 입력 및 출력이 프로젝트 파일에 지정된 경우 대상을 증분 방식으로 빌드할 수 있습니다.
Target 요소의 Inputs 및 Outputs 특성으로 값을 지정합니다.
다음 예제에서는 Inputs 및 Outputs의 대상에 대해 @(CSFile) 항목 목록과 hello.exe 파일을 지정합니다.
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
...
</Target>
MSBuild는 입력의 타임스탬프와 대상의 출력을 비교합니다. 이 예제에서 항목 목록의 @(CSFile) 파일이 hello.exe 파일보다 최신인 경우 MSBuild는 대상을 빌드하고, 그렇지 않으면 대상을 건너뜁니다.
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
<Csc
Sources="@(CSFile)"
OutputAssembly="hello.exe"/>
</Target>
일대일 매핑과 직접 매핑 없음 비교
대상에 입력 및 출력을 지정하면 각 출력이 하나의 입력에 직접 매핑되거나 출력과 입력 사이에 직접 매핑이 없습니다. 이 예제에서 Csc 작업은 단일 입력에 매핑되지 않는 출력 어셈블리를 지정합니다. 이 작업의 경우 출력은 모든 입력에 따라 달라집니다.
다음은 일대일 매핑과 직접 매핑 없음에 대한 몇 가지 고려 사항입니다.
입력과 출력 간의 직접 매핑이 없는 대상은 항상 각 출력이 단일 입력에 매핑되는 대상보다 더 자주 빌드됩니다. 대상에 직접 매핑이 없는 경우 MSBuild는 일부 입력만 변경하면 다시 작성할 특정 출력을 결정할 수 없습니다.
출력과 입력 간의 직접 매핑을 식별할 수 있는 작업은 증분 빌드에 가장 적합합니다. 예를 들어 .license 파일을 생성하는 LC 작업 태스크가 있습니다.
여러 입력에서 단일 출력 어셈블리를 생성하는 작업은 증분 빌드에 적합하지 않습니다. 예를 들어 csc.exe 파일을 래핑하고 실행 파일, 라이브러리 및 모듈을 생성하는 Csc 작업과 vbc.exe 파일을 래핑하는 Vbc 작업이 있습니다.
변환을 사용하여 일대일 매핑 만들기
다음 예제에서는 도움말 시스템에 대한 콘텐츠 파일을 빌드하는 프로젝트를 정의합니다. 이 프로젝트는 원본 .txt 파일을 XML 메타데이터 파일과 결합하여 시스템에서 사용하는 최종 .help 파일을 생성하는 중간 .content 파일로 변환하여 작동합니다. 프로젝트에는 다음 작업이 포함됩니다.
-
GenerateContentFiles: .txt 파일을 .content 파일로 변환합니다. -
BuildHelp: .content 파일과 XML 메타데이터 파일을 결합하여 최종 .help 파일을 빌드합니다.
이 프로젝트는 변환을 사용하여 태스크의 입력과 출력 간에 일대일 매핑을 GenerateContentFiles 만듭니다.
Output 요소는 작업의 출력을 GenerateContentFiles 작업에 대한 BuildHelp 입력으로 자동으로 사용하도록 설정됩니다.
프로젝트 파일에는 Convert 대상과 Build 포함됩니다. 각 Convert 및 Build 대상에 각각 GenerateContentFiles 태스크와 BuildHelp 태스크가 배치되어 각 대상이 증분 방식으로 빌드될 수 있습니다.
GenerateContentFiles 작업의 출력을 BuildHelp 작업의 입력으로 사용할 수 있도록 ContentFile 항목 목록에 배치하는 Output 요소 정의. 이 방법은 한 작업의 출력을 다른 작업에 대한 입력으로 자동으로 제공합니다. 각 작업에서 개별 항목 또는 항목 목록을 수동으로 나열할 필요는 없습니다.
비고
Convert 대상이 증분 방식으로 빌드할 수 있지만, 그 대상에서 생성된 모든 출력은 항상 Build 대상의 입력으로 필요합니다. MSBuild는 Output 요소를 사용할 때 한 대상의 모든 출력을 다른 대상에 대한 입력으로 자동으로 제공합니다.
<Project DefaultTargets="Build">
<ItemGroup>
<TXTFile Include="*.txt"/>
<XMLFiles Include="\metadata\*.xml"/>
</ItemGroup>
<Target Name = "Convert"
Inputs="@(TXTFile)"
Outputs="@(TXTFile->'%(Filename).content')">
<GenerateContentFiles
Sources = "@(TXTFile)">
<Output TaskParameter = "OutputContentFiles"
ItemName = "ContentFiles"/>
</GenerateContentFiles>
</Target>
<Target Name = "Build" DependsOnTargets = "Convert"
Inputs="@(ContentFiles);@(XMLFiles)"
Outputs="$(MSBuildProjectName).help">
<BuildHelp
ContentFiles = "@(ContentFiles)"
MetadataFiles = "@(XMLFiles)"
OutputFileName = "$(MSBuildProjectName).help"/>
</Target>
</Project>