Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í jakofalse
. 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ří.