Condividi tramite


Trasformazioni di MSBuild

Una trasformazione è una conversione uno-a-uno di un elenco di elementi in un altro. Oltre a consentire la conversione di elenchi di elementi da parte di un progetto, una trasformazione consente a una destinazione di identificare un mapping diretto tra input e output. In questo argomento vengono descritte le trasformazioni e il relativo utilizzo in MSBuild per compilare progetti in modo più efficiente.

Modificatori di trasformazione

Le trasformazioni non sono arbitrarie, ma sono limitate da una sintassi speciale in cui tutti i modificatori di trasformazione devono essere nel formato %(NomeMetadatiElementi). I metadati degli elementi possono essere utilizzati come modificatori della trasformazione. Sono inclusi i metadati noti degli elementi, assegnati a ogni elemento al momento della creazione. Per un elenco di tutti i metadati di elemento noti, vedere Metadati noti degli elementi di MSBuild.

Nell'esempio riportato di seguito, un elenco di file .resx viene trasformato in un elenco di file .resources. Il modificatore di trasformazione %(filename) specifica che ogni file .resources ha lo stesso nome del file .resx corrispondente.

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

Nota

Per un elenco di elementi trasformato è possibile specificare un separatore personalizzato, in modo analogo a quanto accade con un elenco di elementi standard. Per separare ad esempio un elenco di elementi trasformato utilizzando una virgola (,) anziché il punto e virgola predefinito (;), utilizzare il codice XML seguente.

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

Se ad esempio gli elementi nell'elenco di elementi @(RESXFile) sono Form1.resx, Form2.resx e Form3.resx, gli output nell'elenco trasformato saranno Form1.resources, Form2.resources e Form3.resources.

Utilizzo di più modificatori

Un'espressione di trasformazione può contenere più modificatori, che possono essere combinati in qualsiasi ordine e ripetuti. Nell'esempio seguente il nome della directory che contiene il file viene modificato, ma i file mantengono nome ed estensione originali.

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

Se ad esempio gli elementi contenuti nell'elenco di elementi RESXFile sono Project1\Form1.resx, Project1\Form2.resx e Project1\Form3.text, gli output nell'elenco trasformato saranno Toolset\Form1.resx, Toolset\Form2.resx e Toolset\Form3.text.

Analisi delle dipendenze

Le trasformazioni garantiscono un mapping uno-a-uno tra l'elenco di elementi trasformato e l'elenco di elementi originale. Se pertanto una destinazione crea output che sono trasformazioni di input, in MSBuild è possibile analizzare i timestamp di input e output e decidere se ignorare, compilare o ricompilare parzialmente una destinazione.

In Attività Copy nell'esempio seguente, ogni file dell'elenco di elementi BuiltAssemblies è associato a un file nella cartella di destinazione dell'attività, specificata utilizzando una trasformazione nell'attributo Outputs. Se viene modificato un file dell'elenco di elementi BuiltAssemblies, l'attività Copy viene eseguita esclusivamente per il file modificato e tutti gli altri file vengono ignorati. Per ulteriori informazioni sulle analisi di dipendenza e su come utilizzare le trasformazioni, vedere Procedura: eseguire la compilazione incrementale.

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

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

</Target>

Esempio

Descrizione

Nell'esempio seguente viene illustrato un file di progetto di MSBuild in cui sono utilizzate le trasformazioni. In questo esempio si presuppone che vi sia un solo file con estensione xsd file nella directory c:\sub0\sub1\sub2\sub3 e che la directory di lavoro sia c:\sub0.

Codice

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

Commenti

Questo esempio produce l'output che segue.

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

Vedere anche

Attività

Procedura: eseguire la compilazione incrementale

Altre risorse

MSBuild Concepts

Riferimenti a MSBuild