Sdílet prostřednictvím


Přírůstkové sestavení

Přírůstkové sestavení NÁSTROJE MSBuild jsou sestavení optimalizovaná tak, aby cíle s výstupními soubory, které jsou up-to-date s ohledem na odpovídající vstupní soubory, nebyly provedeny.

Cílový prvek může mít atribut Inputs, který označuje, jaké položky cíl očekává jako vstup, a atribut Outputs, který označuje položky, které vytváří jako výstup. Nástroj MSBuild se pokusí najít mapování 1:1 mezi hodnotami těchto atributů. Pokud takové mapování existuje, nástroj MSBuild porovná časové razítko každé vstupní položky s časovým razítkem odpovídající výstupní položky. Výstupní soubory, které nemají mapování 1:1, se porovnávají se všemi vstupními soubory. Položka se považuje za up-to-date, pokud má výstupní soubor stejný věk nebo novější než jeho vstupní soubor nebo soubory.

Poznámka

Když MSBuild vyhodnocuje vstupní soubory, zohledňuje pouze obsah seznamu v aktuálním běhu. Změny v seznamu od poslední sestavy automaticky nezpůsobují, že je cíl neaktuální.

Pokud jsou všechny výstupní položky up-to-date, nástroj MSBuild přeskočí cíl. Tento přírůstkové sestavení cíle může výrazně zlepšit rychlost sestavení. Pokud jsou pouze některé soubory up-to-date, nástroj MSBuild provede cíl, ale přeskočí položky up-to-date, a proto všechny položky up-to-date. Tento proces se označuje jako částečné přírůstkové sestavení.

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

Vezměte v úvahu 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 položky Compile se zkopíruje do záložního adresáře. Záložní soubory mají příponu názvu souboru .bak. Pokud se soubory reprezentované typem položky Compile nebo odpovídajícími záložními soubory po spuštění cíle Backup neodstraní nebo upraví, Backup cíl se v následných buildech přeskočí.

Odvození výstupu

Nástroj MSBuild porovnává atributy Inputs a Outputs cíle a zjišťuje, jestli se má cíl provést. V ideálním případě by sada souborů, které existují po dokončení přírůstkového sestavení, měla zůstat stejná bez ohledu na to, jestli jsou přidružené cíle provedeny nebo ne. Vzhledem k tomu, že vlastnosti a položky, které úkoly vytvářejí nebo mění, mohou ovlivnit sestavení, nástroj MSBuild musí odvodit jejich hodnoty i v případě, že cíl, který je ovlivňuje, je vynechán. Tento proces se označuje jako výstupní usuzování.

Existují tři případy:

  • Cíl má atribut Condition, který se vyhodnotí jako false. V tomto případě se cíl nespustí a nemá na sestavení žádný vliv.

  • Cíl obsahuje zastaralé výstupy a spouští se, aby je aktualizoval na up-to.

  • Cíl nemá žádné zastaralé výstupy a je přeskočen. Nástroj MSBuild vyhodnocuje cíl a provede změny položek a vlastností, jako by byl cíl spuštěn.

Aby bylo zajištěno přírůstkové kompilace, musí úkoly zajistit, aby hodnota atributu TaskParameter libovolného prvku Output byla rovna vstupnímu parametru úkolu. Napří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.

Počínaje verzí MSBuild 3.5 se výstupní odvozování provádí automaticky u položek a skupin vlastností v cíli. CreateItem úkoly nejsou v cíli povinné a měly by se jim vyhnout. Také úlohy CreateProperty by měly být použity pouze k určení, zda byl cíl splněn.

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

Určení, jestli je cíl spuštěn

Z důvodu odvozování výstupu je nutné prozkoumat vlastnosti a položky cíle, abyste zjistili, jestli byl cíl proveden. Uděláte to tak, že do cíle přidáte úkol CreateProperty a dáte mu prvek Output, jehož TaskParameter je ValueSetByTask. Například:

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

Tento kód vytvoří vlastnost CompileRan a poskytne jí hodnotu true, ale pouze pokud je cíl proveden. Pokud se cíl přeskočí, CompileRan se nevytvoří.