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