Partager via


Transformations MSBuild

Mise à jour : novembre 2007

Une transformation est une conversion un à un d'une collection d'éléments en une autre. Outre qu'elle permet à un projet de convertir des collections d'éléments, une transformation offre à une cible la possibilité d'identifier un mappage direct entre ses entrées et ses sorties. Cette rubrique explique les transformations et la manière dont MSBuild les utilise pour générer des projets plus efficacement.

Modificateurs de transformation

Les transformations ne sont pas arbitraires, mais sont limitées par une syntaxe spéciale dans laquelle tous les modificateurs de transformation doivent être au format %(ItemMetaDataName). Toute métadonnée d'élément peut être utilisée comme modificateur de transformation, y compris les métadonnées d'éléments connus assignées à chaque élément à sa création. Pour obtenir la liste des métadonnées d'éléments connus, consultez Métadonnées d'éléments connus MSBuild.

Dans l'exemple suivant, une liste de fichiers .resx est transformée en une liste de fichiers .resources. Le modificateur de transformation %(nom de fichier) spécifie que chaque fichier .resources possède le même nom de fichier que le fichier .resx correspondant.

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

Remarque :

Vous pouvez spécifier un séparateur personnalisé pour une collection d'éléments transformée de la même manière que pour une collection d'éléments normale. Par exemple, pour séparer une collection d'éléments transformée avec une virgule (,) au lieu du point-virgule par défaut (;), utilisez le code XML suivant :

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

Par exemple, si les éléments de la collection @(RESXFile) sont Form1.resx, Form2.resx et Form3.resx, les sorties dans la liste transformée seront Form1.resources, Form2.resources et Form3.resources.

Utilisation de modificateurs multiples

Une transformation peut contenir plusieurs modificateurs, qui peuvent être combinés dans n'importe quel ordre, et les modificateurs peuvent être répétés dans une expression de transformation. Dans l'exemple suivant, le nom du répertoire qui contient les fichiers est modifié mais les fichiers conservent le nom et l'extension de leur fichier d'origine.

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

Par exemple, si les éléments contenus dans la collection d'éléments RESXFile sont Project1\Form1.resx, Project1\Form2.resx et Project1\Form3.text, les sorties dans la liste transformée seront Toolset\Form1.resx, Toolset\Form2.resx et Toolset\Form3.text.

Analyse de dépendance

Les transformations garantissent un mappage un à un entre la collection d'éléments transformée et la collection d'éléments d'origine. Pour cette raison, si une cible crée des sorties qui sont des transformations des entrées, MSBuild peut analyser les horodatages des entrées et des sorties, et décider s'il faut ignorer, générer ou régénérer partiellement une cible.

Dans la tâche Copy de l'exemple suivant, chaque fichier de la collection d'éléments BuiltAssemblies est mappé à un fichier du dossier de destination de la tâche, spécifié avec une transformation dans l'attribut Outputs. Si l'un des fichiers de la collection d'éléments BuiltAssemblies est modifié, la tâche Copy s'exécute uniquement pour les fichiers modifiés, en ignorant tous les autres fichiers. Pour plus d'informations sur l'analyse de dépendance et l'utilisation de transformations, consultez Comment : effectuer des générations incrémentielles.

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

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

</Target>

Exemple

Description

L'exemple suivant illustre un fichier projet MSBuild qui utilise des transformations. Cet exemple emploie un seul fichier .xsd dans le répertoire c:\sub0\sub1\sub2\sub3 et un répertoire de travail c:\sub0.

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>

Commentaires

Cet exemple génère la sortie suivante :

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

Voir aussi

Tâches

Comment : effectuer des générations incrémentielles

Autres ressources

Concepts MSBuild

Référence MSBuild