MSBuild-Transformationen
Aktualisiert: November 2007
Eine Transformation ist eine 1:1-Konvertierung von einer Elementauflistung in eine andere. Über Transformationen können nicht nur Elementauflistungen in einem Projekt umgewandelt werden, sondern auch direkte Zuordnungen zwischen Eingaben und Ausgaben eines Ziels identifiziert werden. In diesem Thema wird erläutert, was Transformationen sind und wie sie von MSBuild zur effizienteren Erstellung von Projekten genutzt werden können.
Transformationsmodifizierer
Transformationen können nicht beliebig ausgeführt werden, sondern unterliegen bestimmten Syntaxbeschränkungen, durch die alle Transformationsmodifizierer das Format %(ItemMetaDataName) aufweisen müssen. Als Transformationsmodifizierer können beliebige Elementmetadaten verwendet werden, darunter auch bekannte Elementmetadaten, die den einzelnen Elementen bei der Erstellung zugewiesen wurden. Eine Liste bekannter Elementmetadaten finden Sie unter Bekannte MSBuild-Elementmetadaten.
Im folgenden Beispiel wird eine Liste von RESX-Dateien in eine Liste von RESOURCES-Dateien transformiert. Durch den Transformationsmodifizierer %(filename) wird festgelegt, dass jede RESOURCES-Datei denselben Dateinamen wie die entsprechende RESX-Datei hat.
@(RESXFile->'%(filename).resources')
Hinweis: |
---|
Benutzerdefinierte Trennzeichen für transformierte Elementauflistungen werden genauso festgelegt wie Trennzeichen für normale Elementauflistungen. Um eine transformierte Elementauflistung durch ein Komma (,) anstatt durch das standardmäßige Semikolon (;) zu trennen, verwenden Sie beispielsweise folgenden XML-Code. @(RESXFile->'Toolset\%(filename)%(extension)', ',') |
Die Elemente der @(RESXFile)-Elementauflistung lauten beispielsweise Form1.resx, Form2.resx und Form3.resx, und die Ausgaben in der transformierten Liste lauten Form1.resources, Form2.resources und Form3.resources.
Verwenden mehrerer Modifizierer
Eine Transformation kann mehrere Modifizierer enthalten, die in beliebiger Reihenfolge kombiniert werden können. Modifizierer können innerhalb eines Transformationsausdrucks wiederholt werden. Im folgenden Beispiel wird der Name des Verzeichnisses geändert, das die Dateien enthält. Der Originalname und die Dateierweiterung werden jedoch beibehalten.
@(RESXFile->'Toolset\%(filename)%(extension)')
Wenn die Elemente der RESXFile-Elementauflistung beispielsweise Project1\Form1.resx, Project1\Form2.resx und Project1\Form3.text lauten, entsprechen die Ausgaben in der transformierten Liste Toolset\Form1.resx, Toolset\Form2.resx und Toolset\Form3.text.
Abhängigkeitsanalyse
Bei Transformationen wird eine 1:1-Zuordnung zwischen der transformierten und der ursprünglichen Elementauflistung sichergestellt. Wenn ein Ziel Ausgaben generiert, die Transformationen der Eingaben sind, kann MSBuild folglich die Timestamps der Eingaben und Ausgaben analysieren und entscheiden, ob ein Ziel erstellt, teilweise neu erstellt bzw. übersprungen wird.
Mit der Copy-Aufgabe im folgenden Beispiel wird jede Datei in der BuiltAssemblies-Elementauflistung einer Datei im Zielordner der Aufgabe zugeordnet, für die eine Transformation im Outputs-Attribut angegeben ist. Wenn sich eine Datei in der BuiltAssemblies-Elementauflistung ändert, wird die Copy-Aufgabe nur für die geänderten Dateien ausgeführt. Alle anderen Dateien werden übersprungen. Weitere Informationen zu Abhängigkeitsanalysen und zum Verwenden von Transformationen finden Sie unter Gewusst wie: Inkrementelles Erstellen.
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
Beispiel
Beschreibung
Im folgenden Beispiel wird eine MSBuild-Projektdatei veranschaulicht, die Transformationen verwendet. In diesem Beispiel wird von einer einzelnen XSD-Datei im Verzeichnis c:\sub0\sub1\sub2\sub3 und dem Arbeitsverzeichnis mit dem Namen c:\sub0 ausgegangen.
Code
<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>
Anmerkungen
Folgende Ergebnisse werden zurückgegeben:
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
Siehe auch
Aufgaben
Gewusst wie: Inkrementelles Erstellen