インクリメンタル ビルド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 は、これらの属性の値間に一対一の対応関係があるかどうかを確認します。MSBuild attempts to find a 1-to-1 mapping between the values of these attributes. 一対一の対応関係が存在する場合、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. 一対一の対応関係が存在しない出力ファイルは、すべての入力ファイルと比較されます。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-to-1 mappings are typically produced by item transformations. 詳細については、「MSBuild 変換」を参照してください。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 項目の種類によって表されるファイル (対応するバックアップ ファイル) が Backup ターゲットの実行後に削除または変更されない場合、Backup ターゲットは以降のビルドでスキップされます。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 は、ターゲットの Inputs 属性と Outputs 属性を比較して、ターゲットを実行する必要があるかどうかを判断します。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.

次の 3 つの場合があります。There are three cases:

  • ターゲットに Condition と評価される false 属性が指定されている場合。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.

    インクリメンタル コンパイルをサポートするために、タスクでは TaskParameter 要素の Output 属性値がタスク入力パラメーターと等しいことを確認する必要があります。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" の 2 つの項目を持つ、項目の種類 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 タスクをターゲットに追加し、Output が "ValueSetByTask" である TaskParameter 要素を指定します。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