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 atributy Outputs 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 ConvertBuild , 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>