Udostępnij przez


Przekształcenia programu MSBuild

Przekształcenie jest jednokrotną konwersją jednej listy elementów na inną. Przekształcenia umożliwiają projektom w programie Visual Studio konwertowanie list elementów. Przekształcenia umożliwiają również obiektom docelowym identyfikowanie bezpośredniego mapowania między ich danymi wejściowymi i wyjściowymi.

W tym artykule wyjaśniono przekształcenia i sposób, w jaki aparat Microsoft Build Engine (MSBuild) używa ich do wydajniejszego kompilowania projektów.

Modyfikatory transformacji

Przekształcenia nie są definiowane arbitralnie. Każda transformacja jest identyfikowana jako modyfikator formatu %(\<ItemMetaDataName>). Wszystkie metadane elementu mogą być używane jako modyfikator transformacji, w tym dobrze znane metadane elementu przypisane do każdego elementu podczas tworzenia. Aby zapoznać się z ogólnie znaną listą metadanych elementu, zobacz MSBuild ogólnie znane metadane elementu.

Poniższy przykład przekształca listę plików resx na listę plików resources . Modyfikator przekształcania %(filename) określa, że każdy plik resources ma taką samą nazwę pliku jak odpowiedni plik resx :

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

Jeśli elementy na @(RESXFile) liście elementów to Form1.resx, Form2.resx i Form3.resx, przekształcona lista zawiera dane wyjściowe Form1.resources, Form2.resources i Form3.resources.

Uwaga / Notatka

Domyślnym separatorem elementów na przekształconej liście jest średnik ;. Separator niestandardowy można określić w taki sam sposób, jak separator dla listy elementów standardowych. Aby oddzielić elementy przecinkami , , użyj składni @(RESXFile->'Toolset\%(filename)%(extension)', ',').

Modyfikatory transformacji mnogich

Wyrażenie przekształcenia może zawierać wiele modyfikatorów, które można połączyć w dowolnej kolejności i można je powtórzyć. W poniższym przykładzie nazwa katalogu zawierającego pliki została zmieniona, ale pliki zachowują oryginalną nazwę i rozszerzenie nazwy pliku:

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

Jeśli elementy na RESXFile liście elementów to Project1\Form1.resx, Project1\Form2.resx i Project1\Form3.text, przekształcona lista zawiera elementy wyjściowe Toolset\Form1.resx, Toolset\Form2.resx i Toolset\Form3.text.

Mapowanie docelowe i analiza zależności

Przekształcenia gwarantują mapowanie jeden do jednego między przekształconą listą elementów a oryginalną listą elementów. Jeśli element docelowy tworzy dane wyjściowe, które są przekształceniami danych wejściowych, program MSBuild może analizować znaczniki czasu danych wejściowych i wyjściowych. Program MSBuild używa informacji do podjęcia decyzji, czy pominąć, zbudować, czy częściowo odbudować element docelowy.

W poniższym przykładzie dane wejściowe zadania kopiowania są przekształcane w dane wyjściowe. Każdy plik na liście elementów wejściowych BuiltAssemblies jest mapowany na plik w folderze docelowym zadania określonego za pomocą przekształcenia w atrybucie Outputs . Jeśli plik na BuiltAssemblies liście elementów ulegnie zmianie, Copy task uruchamia się tylko dla zmienionego pliku i pomija wszystkie pozostałe.

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

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

</Target>

Aby uzyskać więcej informacji na temat analizy zależności i sposobu używania przekształceń, zobacz Kompilacje przyrostowe programu MSBuild dla nowych lub nieaktualnych celów.

Plik projektu z przekształceniami

W poniższym przykładzie przedstawiono plik projektu dla programu MSBuild, który używa przekształceń. W przykładzie przyjęto założenie, że katalog c:\sub0\sub1\sub2\sub3 zawiera tylko jeden plik xsd , a katalog roboczy to c:\sub0.

<Project>
    <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>

W przykładzie są generowane następujące dane wyjściowe:

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