증분 빌드Incremental Builds

증분 빌드는 해당 입력 파일과 관련하여 최신 상태인 출력 파일이 있는 대상이 실행되지 않도록 최적화된 빌드입니다.Incremental builds are builds that are optimized so that targets that have output files that are up-to-date with respect to their corresponding input files are not executed. 대상 요소는 대상이 입력으로 예상하는 항목을 나타내는 Inputs 특성 및 출력으로 생성하는 항목을 나타내는 Outputs 특성을 모두 가질 수 있습니다.A target element can have both an Inputs attribute, which indicates what items the target expects as input, and an Outputs attribute, which indicates what items it produces as output. MSBuild는 이러한 특성의 값 사이에서 1-1 매핑을 찾으려고 시도합니다.MSBuild attempts to find a 1-to-1 mapping between the values of these attributes. 1-1 매핑이 존재하는 경우 MSBuild는 해당 출력 항목의 타임스탬프와 모든 입력 항목의 타임스탬프를 비교합니다.If a 1-to-1 mapping exists, MSBuild compares the time stamp of every input item to the time stamp of its corresponding output item. 1-1 매핑이 없는 출력 파일은 모든 입력 파일과 비교됩니다.Output files that have no 1-to-1 mapping are compared to all input files. 출력 파일이 해당 입력 파일보다 최신이거나 두 파일의 타임스탬프가 같은 경우 항목이 최신 상태인 것으로 간주됩니다.An item is considered up-to-date if its output file is the same age or newer than its input file or files.

모든 출력 항목이 최신 상태인 경우 MSBuild는 대상을 건너뜁니다.If all output items are up-to-date, MSBuild skips the target. 이 대상의 증분 빌드는 빌드 속도를 크게 향상 시킬 수 있습니다.This incremental build of the target can significantly improve the build speed. 일부 파일만 최신 상태인 경우 MSBuild는 대상을 실행하지만 최신 항목을 건너뛰므로 모든 항목을 최신 상태로 합니다.If only some files are up-to-date, MSBuild executes the target but skips the up-to-date items, and thereby brings all items up-to-date. 이는 부분 증분 빌드로 알려져 있습니다.This is known as a partial incremental build.

1-1 매핑은 일반적으로 항목 변환에서 생성됩니다.1-to-1 mappings are typically produced by item transformations. 자세한 내용은 변환을 참조하세요.For more information, see Transforms.

다음 대상을 살펴보세요.Consider the following target.

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

Compile 항목 형식으로 표시되는 파일 집합은 백업 디렉터리에 복사됩니다.The set of files represented by the Compile item type are copied to a backup directory. 백업 파일에는 .bak 파일 이름 확장명이 있습니다.The backup files have the .bak file name extension. Compile 항목 형식으로 표시되는 파일 또는 해당 백업 파일은 백업 대상이 실행된 후 삭제 또는 수정되지 않으며 후속 빌드에서 백업 대상을 건너뜁니다.If the files represented by the Compile item type, or the corresponding backup files, are not deleted or modified after the Backup target is run, then the Backup target is skipped in subsequent builds.

출력 유추Output Inference

MSBuild는 대상의 InputsOutputs 특성을 비교하여 대상을 실행해야 하는지 여부를 결정합니다.MSBuild compares the Inputs and Outputs attributes of a target to determine whether the target has to execute. 이상적으로 증분 빌드가 완료된 후 존재하는 파일 집합은 연결된 대상의 실행 여부와 관계 없이 동일하게 유지되어야 합니다.Ideally, the set of files that exists after an incremental build is completed should remain the same whether or not the associated targets are executed. 작업에 의해 만들어지거나 변경되는 속성 및 항목은 빌드에 영향을 줄 수 있기 때문에 MSBuild는 영향을 주는 대상을 건너뛰더라도 해당 값을 유추해야 합니다.Because properties and items that are created or altered by tasks can affect the build, MSBuild must infer their values even if the target that affects them is skipped. 이는 출력 유추로 알려져 있습니다.This is known as output inference.

여기에는 세 가지 경우가 있습니다.There are three cases:

  • 대상에 false로 평가되는 Condition 특성이 있습니다.The target has a Condition attribute that evaluates to false. 이 경우 대상이 실행되지 않으며 빌드에는 아무 영향이 없습니다.In this case, the target is not run, and has no effect on the build.

  • 대상에 오래된 출력이 있으며 최신 상태가 되도록 실행됩니다.The target has out-of-date outputs and is run to bring them up to date.

  • 대상에 오래된 출력이 없으며 건너뜁니다.The target has no out-of-date outputs and is skipped. MSBuild는 대상을 평가하고 대상이 실행된 것처럼 항목 및 속성에 변경 내용을 만듭니다.MSBuild evaluates the target and makes changes to items and properties as if the target had been run.

    증분 컴파일을 지원하기 위해 작업은 모든 Output 요소의 TaskParameter 특성 값이 작업 입력 매개 변수와 동일한지 확인해야 합니다.To support incremental compilation, tasks must ensure that the TaskParameter attribute value of any Output element is equal to a task input parameter. 다음은 몇 가지 예입니다.Here are some examples:

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

대상이 실행되거나 건너뛰어지는지 여부에 관계 없이 값 "123"을 갖는 속성 Easy를 만듭니다.This creates the property Easy, which has the value "123" whether or not the target is executed or skipped.

<CreateItem Include="a.cs;b.cs">  
    <Output ItemName="Simple" TaskParameter="Include" />  
</CreateItem>  

대상이 실행되거나 건너뛰어지는지 여부에 관계 없이 두 개의 항목 "a.cs" 및 "b.cs"를 갖는 항목 종류 Simple을 만듭니다.This creates the item type Simple, which has two items, "a.cs" and "b.cs", whether or not the target is executed or skipped.

MSBuild 3.5부터 출력 유추는 대상의 항목 및 속성 그룹에 대해 자동으로 수행됩니다.Starting in MSBuild 3.5, output inference is performed automatically on item and property groups in a target. CreateItem 작업은 대상에 필요하지 않으며 피해야 합니다.CreateItem tasks are not required in a target and should be avoided. 또한 CreateProperty 작업은 대상이 실행되었는지 여부를 결정하도록 대상에만 사용되어야 합니다.Also, CreateProperty tasks should be used in a target only to determine whether a target has been executed.

대상이 실행되었는지 여부 결정Determining Whether a Target Has Been Run

출력 유추로 인해 대상에 CreateProperty 작업을 추가하여 대상이 실행되었는지 여부를 결정할 수 있도록 속성 및 항목을 검사해야 합니다.Because of output inference, you have to add a CreateProperty task to a target to examine properties and items so that you can determine whether the target has been executed. 대상에 CreateProperty 작업을 추가하고 TaskParameter가 "ValueSetByTask"인 Output 요소를 제공합니다.Add the CreateProperty task to the target and give it an Output element whose TaskParameter is "ValueSetByTask".

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

대상이 실행되는 경우에만 속성 CompileRan을 만들고 true 값을 제공합니다.This creates the property CompileRan and gives it the value true, but only if the target is executed. 대상을 건너뛰는 경우 CompileRan은 생성되지 않습니다.If the target is skipped, CompileRan is not created.

참고 항목See Also

대상Targets