Constructions conditionnelles MSBuild
MSBuild fournit un mécanisme de traitement de type « soit/soit » avec les éléments Choose, When et Otherwise.
Utiliser l’élément Choose
L’élément Choose
contient une série d’éléments When
avec des attributs Condition
qui sont testés du haut vers le bas, jusqu’à ce qu’un élément avec la valeur true
soit trouvé. Si plusieurs éléments When
ont la valeur true
, seul le premier est utilisé. Un Otherwise
élément, s’il est présent, est évalué si aucune condition sur un When
élément est évaluée à true
.
Les éléments Choose
peuvent être utilisés comme des éléments enfants des éléments Project
, When
et Otherwise
. Les éléments When
et Otherwise
peuvent avoir des éléments enfants ItemGroup
, PropertyGroup
ou Choose
.
Exemple
L’exemple suivant utilise les éléments Choose
et When
pour un traitement de type « soit/soit ». Les propriétés et les éléments du projet sont définis en fonction de la valeur de la propriété Configuration
.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApplication1</RootNamespace>
<AssemblyName>ConsoleApplication1</AssemblyName>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<Choose>
<When Condition=" '$(Configuration)'=='Debug' ">
<PropertyGroup>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>.\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Compile Include="UnitTesting\*.cs" />
<Reference Include="NUnit.dll" />
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='retail' ">
<PropertyGroup>
<DebugSymbols>false</DebugSymbols>
<Optimize>true</Optimize>
<OutputPath>.\bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
</When>
</Choose>
<!-- Rest of Project -->
</Project>
Dans cet exemple, une condition sur une constante DEFINED_CONSTANT
du compilateur est utilisée. Ces définitions sont incluses dans la DefineConstants
propriété. L’expression régulière est utilisée pour mettre en correspondance la constante exacte dans une liste séparée par des points-virgules.
<Choose>
<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(
$(DefineConstants), '^(.*;)*DEFINED_CONSTANT(;.*)*$'))">
<!-- When DEFINED_CONSTANT is defined. -->
</When>
<!-- other conditions -->
</Choose>