Sdílet prostřednictvím


Transformace nástroje MSBuild

Transformace je převod seznamu položek 1:1 na druhý. Kromě povolení projektu převést seznamy položek transformace umožňuje cíli identifikovat přímé mapování mezi vstupy a výstupy. Toto téma vysvětluje transformace a způsob, jakým je nástroj MSBuild používá k efektivnějšímu sestavování projektů.

Modifikátory transformace

Transformace nejsou libovolné, ale jsou omezeny speciální syntaxí, ve které musí být všechny modifikátory transformace ve formátu %(<ItemMetaDataName>). Všechna metadata položek lze použít jako modifikátor transformace. To zahrnuje dobře známá metadata položek, která jsou přiřazena ke každé položce při jejím vytvoření. Seznam známých metadat položek najdete v tématu Metadata známých položek.

V následujícím příkladu se seznam souborů .resx transformuje na seznam souborů .resources . Modifikátor transformace %(název_souboru) určuje, že každý soubor .resources má stejný název souboru jako odpovídající soubor .resx .

@(RESXFile->'%(filename).resources')

Pokud jsou například položky v seznamu položek @(RESXFile), Form1.resx, Form2.resx a Form3.resx, výstupy v transformovaném seznamu budou Form1.resources, Form2.resources a Form3.resources.

Poznámka:

Vlastní oddělovač pro seznam transformovaných položek můžete zadat stejným způsobem jako oddělovač pro standardní seznam položek. Pokud chcete například oddělit transformovaný seznam položek pomocí čárky (,) místo výchozího středníku (;), použijte následující KÓD XML: @(RESXFile->'Toolset\%(filename)%(extension)', ',')

Použití více modifikátorů

Výraz transformace může obsahovat více modifikátorů, které lze kombinovat v libovolném pořadí a lze je opakovat. V následujícím příkladu se změní název adresáře, který obsahuje soubory, ale soubory zachovají původní název a příponu názvu souboru.

@(RESXFile->'Toolset\%(filename)%(extension)')

Pokud jsou například položky obsažené v RESXFile seznamu položek Project1\Form1.resx, Project1\Form2.resx a Project1\Form3.text, výstupy v transformovaném seznamu budou Toolset\Form1.resx, Toolset\Form2.resx a Toolset\Form3.text.

Analýza závislostí

Transformace zaručují mapování 1:1 mezi transformovaným seznamem položek a původním seznamem položek. Proto pokud cíl vytvoří výstupy, které jsou transformované vstupy, může NÁSTROJ MSBuild analyzovat časové razítka vstupů a výstupů a rozhodnout, zda se má přeskočit, sestavit nebo částečně znovu sestavit cíl.

V úloze Kopírovat v následujícím příkladu se každý soubor v BuiltAssemblies seznamu položek mapuje na soubor v cílové složce úkolu určené pomocí transformace v atributuOutputs. Pokud se soubor v BuiltAssemblies seznamu položek změní, Copy úloha se spustí jenom pro změněný soubor a všechny ostatní soubory se přeskočí. Další informace o analýze závislostí a použití transformací naleznete v tématu Postupy: Sestavení přírůstkově.

<Target Name="CopyOutputs"
    Inputs="@(BuiltAssemblies)"
    Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">

    <Copy
        SourceFiles="@(BuiltAssemblies)"
        DestinationFolder="$(OutputPath)"/>

</Target>

Příklad

Popis

Následující příklad ukazuje soubor projektu MSBuild, který používá transformace. Tento příklad předpokládá, že v adresáři c:\sub0\sub1\sub1\sub3 existuje pouze jeden soubor .xsd a že pracovní adresář je c:\sub0.

Kód

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Schema Include="sub1\**\*.xsd"/>
    </ItemGroup>

    <Target Name="Messages">
        <Message Text="rootdir: @(Schema->'%(rootdir)')"/>
        <Message Text="fullpath: @(Schema->'%(fullpath)')"/>
        <Message Text="rootdir + directory + filename + extension: @(Schema->'%(rootdir)%(directory)%(filename)%(extension)')"/>
        <Message Text="identity: @(Schema->'%(identity)')"/>
        <Message Text="filename: @(Schema->'%(filename)')"/>
        <Message Text="directory: @(Schema->'%(directory)')"/>
        <Message Text="relativedir: @(Schema->'%(relativedir)')"/>
        <Message Text="extension: @(Schema->'%(extension)')"/>
    </Target>
</Project>

Komentáře

Tento příklad vytvoří následující výstup:

rootdir: C:\
fullpath: C:\sub0\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\sub0\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: sub0\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd