Přírůstkové sestavování
Při sestavování velkého projektu je důležité, aby dříve vytvořené komponenty, které jsou stále aktuální, nebyly znovu sestaveny. Pokud jsou všechny cíle vytvořeny pokaždé, bude dokončení každého sestavení trvat dlouhou dobu. Chcete-li povolit přírůstková sestavení (sestavení, ve kterých se nevystavily pouze ty cíle, které nebyly vytvořeny dříve nebo cíle, které nejsou zastaralé, se znovu sestaví), může modul Microsoft Build (MSBuild) porovnat časová razítka vstupních souborů s časovými razítky výstupních souborů a určit, jestli se má cíl přeskočit, sestavit nebo částečně znovu sestavit. Mezi vstupy a výstupy však musí existovat mapování 1:1. Transformace můžete použít k povolení cílů k identifikaci tohoto přímého mapování. Další informace o transformacích najdete v tématu Transformace.
Zadání vstupů a výstupů
Cíl lze sestavit přírůstkově, pokud jsou vstupy a výstupy zadané v souboru projektu.
Zadání vstupů a výstupů pro cíl
Inputs
Použijte atributyOutputs
elementuTarget
. Příklad:<Target Name="Build" Inputs="@(CSFile)" Outputs="hello.exe">
Nástroj MSBuild může porovnat časová razítka vstupních souborů s časovými razítky výstupních souborů a určit, zda se má přeskočit, sestavit nebo částečně znovu sestavit cíl. Pokud je v následujícím příkladu nějaký soubor v @(CSFile)
seznamu položek novější než soubor hello.exe , nástroj MSBuild spustí cíl, jinak se přeskočí:
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
<Csc
Sources="@(CSFile)"
OutputAssembly="hello.exe"/>
</Target>
Pokud jsou vstupy a výstupy zadány v cíli, každý výstup se může mapovat pouze na jeden vstup, nebo mezi výstupy a vstupy nemůže být žádné přímé mapování. V předchozí úloze Csc, například výstup , hello.exe, nelze namapovat na žádný jediný vstup - závisí na všech z nich.
Poznámka:
Cíl, ve kterém mezi vstupy a výstupy neexistuje přímé mapování, se vždy sestaví častěji než cíl, ve kterém se každý výstup může mapovat pouze na jeden vstup, protože NÁSTROJ MSBuild nemůže určit, které výstupy je potřeba znovu sestavit, pokud se některé vstupy změnily.
Úlohy, ve kterých můžete identifikovat přímé mapování mezi výstupy a vstupy, jako je úloha LC, jsou nejvhodnější pro přírůstkové sestavení, na rozdíl od úloh, jako je Csc a Vbc, které vytvářejí jedno výstupní sestavení z řady vstupů.
Příklad
Následující příklad používá projekt, který vytváří soubory nápovědy pro hypotetický systém nápovědy. Projekt funguje tak, že převede zdrojové soubory .txt na zprostředkující soubory .content , které se pak zkombinují se soubory metadat XML a vytvoří konečný soubor nápovědy používaný systémem nápovědy. Projekt používá následující hypotetické úkoly:
GenerateContentFiles
: Převede soubory .txt na soubory .content .BuildHelp
: Kombinuje soubory .content a soubory metadat XML k sestavení konečného souboru .help .
Projekt používá transformace k vytvoření mapování 1:1 mezi vstupy a výstupy v GenerateContentFiles
úkolu. Další informace najdete v tématu Transformace. Element je také nastaven tak, Output
aby automaticky používal výstupy z GenerateContentFiles
úkolu jako vstupy pro BuildHelp
úkol.
Tento soubor projektu obsahuje jak tyto cíle Convert
Build
, tak i cíle. Úkoly GenerateContentFiles
a úkoly se umístí do Convert
cílů a Build
v uvedeném pořadí tak, aby každý cíl mohl být sestaven přírůstkověBuildHelp
. Pomocí elementu Output
jsou výstupy GenerateContentFiles
úkolu umístěny v ContentFile
seznamu položek, kde lze použít jako vstupy pro BuildHelp
úkol. Použití elementu Output
tímto způsobem automaticky poskytuje výstupy z jednoho úkolu jako vstupy pro jiný úkol, abyste nemuseli v každém úkolu vypisovat jednotlivé položky nebo seznamy položek ručně.
Poznámka:
Convert
I když se cíl může sestavit přírůstkově, všechny výstupy z daného cíle se vždy vyžadují jako vstupy cíleBuild
. Nástroj MSBuild automaticky poskytuje všechny výstupy z jednoho cíle jako vstupy pro jiný cíl při použití elementu Output
.
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<ItemGroup>
<TXTFile Include="*.txt"/>
<XMLFiles Include="\metadata\*.xml"/>
</ItemGroup>
<Target Name = "Convert"
Inputs="@(TXTFile)"
Outputs="@(TXTFile->'%(Filename).content')">
<GenerateContentFiles
Sources = "@(TXTFile)">
<Output TaskParameter = "OutputContentFiles"
ItemName = "ContentFiles"/>
</GenerateContentFiles>
</Target>
<Target Name = "Build" DependsOnTargets = "Convert"
Inputs="@(ContentFiles);@(XMLFiles)"
Outputs="$(MSBuildProjectName).help">
<BuildHelp
ContentFiles = "@(ContentFiles)"
MetadataFiles = "@(XMLFiles)"
OutputFileName = "$(MSBuildProjectName).help"/>
</Target>
</Project>