Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
Nota: