Přírůstková sestaveníIncremental builds

Přírůstková sestavení jsou sestavení, která jsou optimalizována tak, aby cíle, které mají výstupní soubory, jež jsou aktuální s ohledem na jejich odpovídající vstupní soubory, již nebyly prováděny.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. Cílový prvek může mít atribut Inputs, který určuje, jaké vstupní položky jsou z hlediska cíle očekávány, a atribut Outputs, který určuje položky vytvořené na výstupu.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. Nástroj MSBuild se mezi hodnotami těchto atributů pokouší nalézt mapování 1 : 1.MSBuild attempts to find a 1-to-1 mapping between the values of these attributes. Pokud mapování 1 : 1 existuje, porovná nástroj MSBuild časové razítko každé vstupní položky s časovým razítkem odpovídající položky na výstupu.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. Výstupní soubory, které nemají mapování 1 : 1, jsou porovnány se všemi vstupními soubory.Output files that have no 1-to-1 mapping are compared to all input files. Položka je považována za aktuální, pokud je její výstupní soubor stejně starý nebo novější než její vstupní soubor(y).An item is considered up-to-date if its output file is the same age or newer than its input file or files.

Poznámka

Když MSBuild vyhodnotí vstupní soubory, bude se brát v úvahu jenom obsah seznamu v aktuálním spuštění.When MSBuild evaluates the input files, only the contents of the list in the current execution are considered. Změny v seznamu od posledního sestavení automaticky nedělají cíl v aktuálním stavu.Changes in the list from the last build do not automatically make a target out-of-date.

Jsou-li všechny výstupní položky aktuální, je cíl nástrojem MSBuild vynechán.If all output items are up-to-date, MSBuild skips the target. Toto přírůstkové sestavení cíle může významně zlepšit rychlost sestavení.This incremental build of the target can significantly improve the build speed. Jsou-li aktuální jen některé soubory, nástroj MSBuild spustí cíl, ale vynechá aktuální položky a tím změní všechny položky na aktuální.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. Tento proces se označuje jako částečné přírůstkové sestavení.This process is known as a partial incremental build.

Mapování 1 : 1 jsou obvykle tvořena transformací položek.1-to-1 mappings are typically produced by item transformations. Další informace najdete v tématu transformace.For more information, see Transforms.

Uvažujme následující cíl.Consider the following target.

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

Sada souborů reprezentovaných Compile typem položky je zkopírována do záložního adresáře.The set of files represented by the Compile item type is copied to a backup directory. Záložní soubory mají příponu názvu souboru . bak .The backup files have the .bak file name extension. Pokud nejsou soubory, které jsou určeny typem položky Compile, nebo odpovídající záložní soubory odstraněny nebo změněny po spuštění cíle zálohování, dojde v následujících sestaveních k vynechání cíle zálohování.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.

Odvození výstupuOutput inference

Nástroj MSBuild porovnává cílové atributy Inputs a Outputs, aby určil, zda bude cíl proveden.MSBuild compares the Inputs and Outputs attributes of a target to determine whether the target has to execute. V ideálním případě nedojde po dokončení přírůstkového sestavení ke změně existující sady souborů bez ohledu na spuštění přidružených cílů.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. Vzhledem k tomu, že vlastnosti a položky vytvořené nebo upravené pomocí úkolů mohou ovlivnit sestavení, musí nástroj MSBuild odvodit jejich hodnoty i v případě vynechání cíle, který je ovlivňuje.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. Tento proces se označuje jako odvození výstupu.This process is known as output inference.

Existují tři případy:There are three cases:

  • Cíl obsahuje atribut Condition, který je vyhodnocen jako false.The target has a Condition attribute that evaluates to false. Cíl v tomto případě není spuštěn a nemá žádný vliv na sestavení.In this case, the target is not run, and has no effect on the build.

  • Cíl obsahuje zastaralé výstupy a je spuštěn, aby byl aktuální.The target has out-of-date outputs and is run to bring them up-to-date.

  • Cíl neobsahuje žádné neaktuální výstupy a je přeskočen.The target has no out-of-date outputs and is skipped. Nástroj MSBuild vyhodnotí cíl a provede změny u položek a vlastností, jako kdyby byl cíl spuštěn.MSBuild evaluates the target and makes changes to items and properties as if the target had been run.

Pro podporu přírůstkové kompilace musí úkoly zajistit, aby byla hodnota atributu TaskParameter jakéhokoli prvku Output rovna vstupnímu parametru úkolu.To support incremental compilation, tasks must ensure that the TaskParameter attribute value of any Output element is equal to a task input parameter. Tady je několik příkladů:Here are some examples:

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

Tento kód vytvoří vlastnost snadno, která má hodnotu "123", bez ohledu na to, zda je cíl proveden nebo vynechán.This code creates the property Easy, which has the value "123" whether or not the target is executed or skipped.

Při spuštění nástroje MSBuild 3.5 se u skupin položek a vlastností v cíli automaticky provede odvození výstupu.Starting in MSBuild 3.5, output inference is performed automatically on item and property groups in a target. CreateItem úkoly nejsou v cíli požadovány a je třeba se jim vyhnout.CreateItem tasks are not required in a target and should be avoided. Úkoly CreateProperty by měly být použity v cíli pouze k určení toho, zda byl cíl spuštěn.Also, CreateProperty tasks should be used in a target only to determine whether a target has been executed.

Před nástrojem MSBuild 3,5 můžete použít úlohu CreateItem – .Prior to MSBuild 3.5, you can use the CreateItem task.

Zjištění, zda byl cíl spuštěnDetermine whether a target has been run

Z důvodu odvození výstupu je nutné přidat CreateProperty úlohu k cíli pro prohlédnutí vlastností a položek, abyste mohli určit, zda byl cíl proveden.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. Přidejte úkol CreateProperty do cíle a přiřaďte mu prvek Output, jehož TaskParameter je „ValueSetByTask“.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>

Tento kód vytvoří vlastnost CompileRan a udělí jí hodnotu true , ale pouze v případě, že je cíl proveden.This code creates the property CompileRan and gives it the value true, but only if the target is executed. Pokud je cíl vynechán, nebude vlastnost CompileRan vytvořena.If the target is skipped, CompileRan is not created.

Viz takéSee also