Přírůstková sestavení

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. 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. Nástroj MSBuild se mezi hodnotami těchto atributů pokouší nalézt mapování 1 : 1. 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. Výstupní soubory, které nemají mapování 1 : 1, jsou porovnány se všemi vstupními soubory. 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).

Poznámka:

Když nástroj MSBuild vyhodnocuje vstupní soubory, považují se pouze za obsah seznamu v aktuálním spuštění. Změny v seznamu z posledního buildu automaticky nevytvávají cíl, který je zastaralý.

Jsou-li všechny výstupní položky aktuální, je cíl nástrojem MSBuild vynechán. Toto přírůstkové sestavení cíle může výrazně zlepšit rychlost sestavení. 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í. Tento proces se označuje jako částečné přírůstkové sestavení.

Mapování 1:1 lze vytvořit pouze tak Outputs , že atribut transformuje Inputs . Další informace najdete v tématu Transformace.

Uvažujme následující cíl.

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

Sada souborů reprezentovaných typem Compile položky se zkopíruje do záložního adresáře. Záložní soubory mají příponu názvu souboru .bak . 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í.

Odvození výstupu

Nástroj MSBuild porovnává cílové atributy Inputs a Outputs, aby určil, zda bude cíl proveden. 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ů. 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. Tento proces se označuje jako odvození výstupu.

Existují tři případy:

  • Cíl obsahuje atribut Condition, který je vyhodnocen jako false. Cíl v tomto případě není spuštěn a nemá žádný vliv na sestavení.

  • Cíl obsahuje zastaralé výstupy a spouští se, aby byly aktuální.

  • Cíl neobsahuje žádné neaktuální výstupy a je přeskočen. Nástroj MSBuild vyhodnotí cíl a provede změny u položek a vlastností, jako kdyby byl cíl spuštěn.

Pro podporu přírůstkové kompilace musí úkoly zajistit, aby byla hodnota atributu TaskParameter jakéhokoli prvku Output rovna vstupnímu parametru úkolu. Několik příkladů:

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

Tento kód vytvoří vlastnost Easy, která má hodnotu "123", zda je cíl proveden nebo vynechán.

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. CreateItem úkoly nejsou vyžadovány v cíli a měly by se jim vyhnout. Úkoly CreateProperty by měly být použity v cíli pouze k určení toho, zda byl cíl spuštěn.

Před verzí MSBuild 3.5 můžete použít úlohu CreateItem .

Určení, jestli se cíl spustil

Z důvodu odvozování výstupu musíte do cíle přidat CreateProperty úlohu, abyste prozkoumali vlastnosti a položky, abyste mohli zjistit, jestli byl cíl proveden. Přidejte úkol CreateProperty do cíle a přiřaďte mu prvek Output, jehož TaskParameter je „ValueSetByTask“.

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

Tento kód vytvoří vlastnost CompileRan a dává jí hodnotu true, ale pouze pokud je cíl proveden. Pokud je cíl vynechán, nebude vlastnost CompileRan vytvořena.