Przekształcenia w programie MSBuild
Transformacja jest jeden do jednego konwersji z jednego elementu listy do innej.Oprócz włączenia projektu do konwersji elementu listy, transformacji umożliwia docelowych do identyfikowania bezpośredniego mapowania między jego wejść i wyjść.W tym temacie wyjaśniono transformacje i w jaki sposób MSBuild używa ich do tworzenia projektów efektywniej.
Przekształć modyfikatorów
Transformacje są arbitralne, ale są ograniczone przez specjalnej składni, w którym wszystkie przekształcenia modyfikatorów musi być w formacie %(ItemMetaDataName).Każdy element metadanych może służyć jako modyfikator transformacji.Obejmuje to metadanych elementu dobrze znane, przypisany do każdego zapasu, podczas jego tworzenia.Listę znanych element metadanych, zobacz Metadane dobrze znanego elementu MSBuild.
W poniższym przykładzie lista plików .resx przekształceniu listy plików .resources.Modyfikator transformacji %(filename) określa, że każdy plik .resources ma taką samą nazwę odpowiedniego pliku .resx.
@(RESXFile->'%(filename).resources')
[!UWAGA]
Można określić niestandardowy separator listy przekształcony element w taki sam sposób określić separator listy standardowych elementu.Na przykład rozdzielić listę przekształcony element przy użyciu przecinka (,) zamiast domyślnego średnik (;), należy użyć następującego kodu XML.
@(RESXFile->'Toolset\%(filename)%(extension)', ',')
Na przykład, jeśli są elementy na liście element @(RESXFile) Form1.resx, Form2.resx, i Form3.resx, wyjść na liście przekształcone będzie Form1.resources, Form2.resources, i Form3.resources.
Za pomocą modyfikatorów wielu
Wyrażenie transformacji może zawierać wiele modyfikatorami, które mogą być łączone w dowolnej kolejności i może być powtórzone.W następującym przykładzie zostanie zmieniona nazwa katalogu, który zawiera pliki, ale pliki zachowują oryginalne nazwa i rozszerzenie.
@(RESXFile->'Toolset\%(filename)%(extension)')
Na przykład, jeśli elementy są zawarte w RESXFile listy zapasów są Project1\Form1.resx, Project1\Form2.resx, i Project1\Form3.text, wyjść na liście przekształcone będzie Toolset\Form1.resx, Toolset\Form2.resx, i Toolset\Form3.text.
Analiza zależności
Transformacje zagwarantować mapowanie jeden do jednego między listą przekształcony element i lista oryginalnego elementu.Dlatego, jeśli element docelowy tworzy wyjścia, które są transformacje nakładów, MSBuild można analizować sygnatury czasowe wejść i wyjść i zdecydować, czy należy pominąć, tworzenia lub częściowo odbudować elementu docelowego.
W Copy — Zadanie w następującym przykładzie każdy plik w BuiltAssemblies mapy elementu listy do pliku w folderze docelowym zadania określone przy użyciu transformacji w Outputs atrybut.Jeśli plik w BuiltAssemblies element listy zmian, Copy zadanie będzie uruchamiane tylko w przypadku zmieniony plik i inne pliki zostaną pominięte.Aby uzyskać więcej informacji o zależnościach analizy i sposobu korzystania z przekształceń, zobacz Porady: kompilacja przyrostowa.
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
Przykład
Opis
W poniższym przykładzie MSBuild pliku projektu, który używa transformacji.W przykładzie założono, że istnieje tylko jeden plik XSD w katalogu c:\sub0\sub1\sub2\sub3 i że katalog roboczy jest c:\sub0.
Kod
<Project xmlns="https://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>
Komentarze
Ten przykład generuje następujące wyniki.
rootdir: C:\
fullpath: C:\xmake\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\xmake\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: xmake\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd
Zobacz też
Zadania
Porady: kompilacja przyrostowa