다음을 통해 공유


증분 빌드

MSBuild 증분 빌드는 해당 입력 파일과 관련하여 up-to출력 파일이 있는 대상이 실행되지 않도록 최적화된 빌드입니다.

대상 요소에는 대상이 입력으로 예상하는 항목을 나타내는 Inputs 특성과 출력으로 생성하는 항목을 나타내는 Outputs 특성이 모두 있을 수 있습니다. MSBuild는 이러한 특성의 값 간에 일대일 매핑을 찾으려고 시도합니다. 이러한 매핑이 있는 경우 MSBuild는 모든 입력 항목의 타임스탬프를 해당 출력 항목의 타임스탬프와 비교합니다. 일대일 매핑이 없는 출력 파일은 모든 입력 파일과 비교됩니다. 출력 파일이 입력 파일 또는 파일과 같은 나이 또는 최신인 경우 항목은 up-to-date로 간주됩니다.

메모

MSBuild가 입력 파일을 평가할 때 현재 실행의 목록 내용만 고려됩니다. 마지막 빌드에서 목록을 변경해도 대상이 자동으로 만료되지는 않습니다.

모든 출력 항목이 up-to-date이면, MSBuild는 대상을 건너뜁니다. 이 대상의 증분 빌드 빌드 속도를 크게 향상시킬 수 있습니다. 일부 파일만 up-to경우 MSBuild는 대상을 실행하지만 up-to-date 항목을 건너뛰므로 모든 항목을 -date up-to가져옵니다. 이 프로세스는 부분 증분 빌드로 알려진다.

일대일 매핑은 Outputs 특성을 Inputs 특성의 변환으로 만들어서만 생성할 수 있습니다. 자세한 내용은 MSBuild 변환을 참조하세요.

다음 대상을 고려합니다.

<Target Name="Backup" Inputs="@(Compile)"
    Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
    <Copy SourceFiles="@(Compile)" DestinationFiles=
        "@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>

Compile 항목 유형으로 표시되는 파일 집합이 백업 디렉터리에 복사됩니다. 백업 파일에는 .bak 파일 이름 확장명이 있습니다. Backup 대상이 실행된 후 Compile 항목 유형 또는 해당 백업 파일이 나타내는 파일이 삭제되거나 수정되지 않으면 후속 빌드에서 Backup 대상이 건너뜁니다.

출력 유추

MSBuild는 대상의 InputsOutputs 특성을 비교하여 대상을 실행해야 하는지 여부를 결정합니다. 이상적으로 증분 빌드가 완료된 후에 존재하는 파일 집합은 연결된 대상이 실행되는지 여부에 관계없이 동일하게 유지되어야 합니다. 태스크가 만들거나 변경하는 속성 및 항목은 빌드에 영향을 줄 수 있으므로 MSBuild는 해당 속성에 영향을 주는 대상을 건너뛰더라도 해당 값을 유추해야 합니다. 이 프로세스는 출력 유추로 알려져 있습니다.

세 가지 경우가 있습니다.

  • 대상에는 Condition 특성이 있고, 이는 false로 평가됩니다. 이 경우 대상이 실행되지 않으며 빌드에 영향을 주지 않습니다.

  • 대상에는 오래된 출력이 있으며 실행되어 up-to.

  • 대상 항목에는 오래된 출력이 없으므로 건너뜁니다. MSBuild는 대상을 평가하고 대상이 실행된 것처럼 항목 및 속성을 변경합니다.

증분 컴파일을 지원하려면 태스크는 Output 요소의 TaskParameter 특성 값이 작업 입력 매개 변수와 같은지 확인해야 합니다. 예를 들어:

<CreateProperty Value="123">
    <Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>

이 코드는 대상이 실행되거나 건너뛰어져도 123 값을 갖는 속성 Easy를 만듭니다.

MSBuild 3.5부터는 대상의 항목 및 속성 그룹에 대해 출력 유추가 자동으로 수행됩니다. CreateItem 작업은 대상에 필요하지 않으며 피해야 합니다. 또한 CreateProperty 작업은 대상이 실행되었는지 여부를 확인하기 위해 대상에서만 사용해야 합니다.

MSBuild 3.5 이전에는 CreateItem 작업을 사용할 수 있습니다.

대상 실행 여부 확인

출력 유추로 인해 대상의 속성과 항목을 검사하여 대상이 실행되었는지 여부를 확인해야 합니다. 이렇게 하려면 대상에 CreateProperty 작업을 추가하고 Output 요소를 추가하여 그 요소의 TaskParameterValueSetByTask으로 지정합니다. 예를 들어:

<CreateProperty Value="true">
    <Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>

이 코드는 속성 CompileRan 만들고 대상이 실행되는 경우에만 true값을 제공합니다. 대상을 건너뛰면 CompileRan가 생성되지 않습니다.