Trasformazioni di MSBuild

Aggiornamento: novembre 2007

Una trasformazione è una conversione uno-a-uno di un insieme di elementi in un altro. Oltre a consentire a un progetto di convertire gli insiemi di elementi, le trasformazioni permettono 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). Come modificatore di trasformazione è possibile usare tutti i metadati dell'elemento, inclusi i metadati di elemento noti assegnati a ciascun 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 insieme di elementi trasformato è possibile specificare un separatore personalizzato, esattamente come per un normale insieme di elementi. Ad esempio, per separare con una virgola (,) anziché con il punto e virgola predefinito (;) un insieme di elementi trasformato, utilizzare il seguente codice XML.

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

Se, ad esempio, gli elementi nell'insieme 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

Una trasformazione può contenere più modificatori che possono essere combinati in qualsiasi ordine e ripetuti in un'espressione di trasformazione. Nell'esempio riportato di seguito, il nome della directory che contiene il file è cambiato ma i file mantengono nome ed estensione originali.

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

Se, ad esempio, gli elementi contenuti nell'insieme di elementi RESXFile sono Project1\Form1.resx, Project1\Form2.resx e Project1\Form3.text, gli output dell'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'insieme di elementi trasformato e l'insieme di elementi originale. Per questo motivo, se una destinazione crea degli output che sono trasformazioni di input, in MSBuild è possibile analizzare i timestamp degli input e degli output e decidere se ignorare, compilare o ricompilare parzialmente una destinazione.

Nell'attività Copia dell'esempio riportato di seguito, ogni file nell'insieme di elementi BuiltAssemblies è associato a un file nella cartella di destinazione dell'attività, specificato con una trasformazione nell'attributo Outputs. Se viene modificato uno dei file nell'insieme di elementi BuiltAssemblies, l'attività Copy verrà eseguita soltanto per i file modificati e tutti gli altri file verranno ignorati. Per ulteriori informazioni sull'analisi delle dipendenze e l'utilizzo delle 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 riportato di seguito, un file di progetto di MSBuild utilizza le trasformazioni. Nell'esempio sono previsti un unico file .xsd nella directory c:\sub0\sub1\sub2\sub3 e una directory di lavoro 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

Concetti relativi a MSBuild

Riferimenti a MSBuild