다음을 통해 공유


새 대상 또는 구식 대상에 대한 MSBuild 증분 빌드

대규모 프로젝트를 빌드할 때 아직 up-to빌드된 대상은 다시 빌드하지 않는 것이 중요합니다. 모든 대상이 매번 빌드되는 경우 각 빌드를 완료하는 데 시간이 오래 걸릴 수 있습니다.

증분 빌드에서는 프로젝트의 아직 빌드되지 않은 대상이나 오래된 대상만 빌드됩니다. MSBuild(Microsoft Build Engine)는 입력 파일의 타임스탬프를 출력 파일의 타임스탬프와 비교합니다. MSBuild는 각 대상을 건너뛰거나 빌드하거나 부분적으로 다시 빌드할지 여부를 결정합니다.

증분 빌드 프로세스에는 대상에 대한 입력과 출력 간의 일대일 매핑이 필요합니다. 변환을 사용하여 대상이 입력-ouput 매핑을 식별할 수 있도록 설정할 수 있습니다. 자세한 내용은 변환을 참조하십시오.

입력 및 출력 지정

MSBuild는 대상의 입력 및 출력이 프로젝트 파일에 지정된 경우 대상을 증분 방식으로 빌드할 수 있습니다. Target 요소의 InputsOutputs 특성으로 값을 지정합니다.

다음 예제에서는 InputsOutputs의 대상에 대해 @(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 포함됩니다. 각 ConvertBuild 대상에 각각 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>