Udostępnij za pośrednictwem


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

Inne zasoby

Pojęcia dotyczące programu MSBuild

Odwołanie do narzędzia MSBuild