Générer les mêmes fichiers sources avec des options différentes

Lorsque vous générez des projets, vous compilez fréquemment les mêmes composants avec des options de génération différentes. Par exemple, vous pouvez créer une version Debug avec des informations de symbole ou une version Release sans informations de symbole, mais avec les optimisations activées. Vous pouvez également générer un projet pour qu’il s’exécute sur une plateforme spécifique comme x86 ou x64. Dans toutes ces situations, la plupart des options de génération restent identiques ; seules quelques options sont modifiées pour contrôler la configuration de build. Avec MSBuild, vous utilisez des propriétés et des conditions pour créer les différentes configurations de build.

Utiliser des propriétés pour contrôler les paramètres de build

L’élément Property définit une variable qui est référencée plusieurs fois dans un fichier projet, par exemple l’emplacement d’un répertoire temporaire, ou définit les valeurs des propriétés qui sont utilisées dans plusieurs configurations, comme une version Debug et une version Release. Pour plus d’informations sur les propriétés, consultez Propriétés MSBuild.

Les propriétés permettent de modifier la configuration de votre build sans avoir à modifier le fichier projet. L’attribut Condition des éléments Property et PropertyGroup vous permet de modifier la valeur des propriétés. Pour plus d’informations sur les conditions MSBuild, consultez la section Conditions.

Pour définir un groupe de propriétés qui dépend d’une autre propriété

  • Utilisez un attribut Condition dans un élément PropertyGroup semblable à ce qui suit :

    <PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
        <DebugType>full</DebugType>
        <Optimize>no</Optimize>
    </PropertyGroup>
    

Pour définir une propriété qui dépend d’une autre propriété

  • Utilisez un attribut Condition dans un élément Property semblable à ce qui suit :

    <DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
    

Spécifier des propriétés sur la ligne de commande

Une fois que votre fichier projet est écrit pour accepter plusieurs configurations, vous devez être en mesure de modifier ces configurations à chaque fois que vous générez votre projet. MSBuild offre cette possibilité en permettant de spécifier des propriétés en ligne de commande à l’aide du commutateur -property ou -p switch.

Pour définir une propriété de projet dans la ligne de commande

  • Utilisez le commutateur -property avec la propriété et la valeur de propriété. Par exemple :

    msbuild file.proj -property:Flavor=Debug
    

    ou

    Msbuild file.proj -p:Flavor=Debug
    

Pour spécifier plusieurs propriétés de projet dans la ligne de commande

  • Utilisez le commutateur -property ou -p plusieurs fois avec la propriété et les valeurs de propriétés, ou utilisez un commutateur -property ou -p et séparez les différentes propriétés par des points-virgules (;). Par exemple :

    msbuild file.proj -p:Flavor=Debug;Platform=x86
    

    ou

    msbuild file.proj -p:Flavor=Debug -p:Platform=x86
    

    Les variables d’environnement sont également considérées comme des propriétés et sont automatiquement incorporées par MSBuild. Pour plus d’informations sur l’utilisation des variables d’environnement, consultez Guide pratique pour utiliser des variables d’environnement dans une build.

    La valeur de propriété spécifiée sur la ligne de commande est prioritaire sur toute valeur qui est définie pour la même propriété dans le fichier projet, et cette valeur du fichier projet est prioritaire sur la valeur d’une variable d’environnement.

    Vous pouvez changer ce comportement à l’aide de l’attribut TreatAsLocalProperty dans une balise de projet. Pour les noms de propriété répertoriés avec cet attribut, la valeur de propriété qui est spécifiée sur la ligne de commande n’est pas prioritaire sur la valeur indiquée dans le fichier projet. Vous en trouverez un exemple plus loin dans cette rubrique.

Exemple 1

L’exemple de code suivant, le projet « Hello World », contient deux nouveaux groupes de propriétés qui peuvent être utilisés pour créer une version Debug et une version Release.

Pour générer la version Debug de ce projet, tapez :

msbuild consolehwcs1.proj -p:flavor=debug

Pour générer la version commerciale de ce projet, tapez :

msbuild consolehwcs1.proj -p:flavor=retail
<Project DefaultTargets = "Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <!-- Sets the default flavor if an environment variable called
    Flavor is not set or specified on the command line -->
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
    </PropertyGroup>

    <!-- Define the DEBUG settings -->
    <PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
        <DebugType>full</DebugType>
        <Optimize>no</Optimize>
    </PropertyGroup>

    <!-- Define the RETAIL settings -->
    <PropertyGroup Condition="'$(Flavor)'=='RETAIL'">
        <DebugType>pdbonly</DebugType>
        <Optimize>yes</Optimize>
    </PropertyGroup>

    <!-- Set the application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldCS</appname>
    </PropertyGroup>

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <CSFile Include = "consolehwcs1.cs"/>
    </ItemGroup>

    <Target Name = "Compile">
        <!-- Run the Visual C# compilation using input files
        of type CSFile -->
        <CSC  Sources = "@(CSFile)"
            DebugType="$(DebugType)"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe" >

            <!-- Set the OutputAssembly attribute of the CSC
            task to the name of the executable file that is
            created -->
            <Output TaskParameter="OutputAssembly"
                ItemName = "EXEFile" />
        </CSC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Exemple 2

L’exemple suivant montre comment utiliser l’attribut TreatAsLocalProperty. La propriété Color a la valeur Blue dans le fichier projet et la valeur Green dans la ligne de commande. Avec TreatAsLocalProperty="Color" dans la balise de projet, la propriété de ligne de commande (Green) ne remplace pas la propriété qui est définie dans le fichier projet (Blue).

Pour générer le projet, entrez la commande suivante :

msbuild colortest.proj -t:go -property:Color=Green
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0" TreatAsLocalProperty="Color">

    <PropertyGroup>
        <Color>Blue</Color>
    </PropertyGroup>

    <Target Name="go">
        <Message Text="Color: $(Color)" />
    </Target>
</Project>

<!--
  Output with TreatAsLocalProperty="Color" in project tag:
     Color: Blue

  Output without TreatAsLocalProperty="Color" in project tag:
     Color: Green
-->