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 jakofalse
. 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.