Условные конструкции MSBuild

MSBuild предоставляет механизм для обработки условий "либо — либо" с помощью элементов Choose, When и Otherwise.

Использование элемента Choose

Элемент Choose содержит ряд элементов When с атрибутами Condition, которые проверяются в порядке сверху вниз, пока один из них не даст значение true. Если значение true дают несколько элементов When, используется только первый из них. Если ни одно из условий элемента When не дает значение true, вычисляется элемент Otherwise (при его наличии).

Элементы Choose можно использовать в качестве дочерних для элементов Project, When и Otherwise. Элементы When и Otherwise могут иметь дочерние элементы ItemGroup, PropertyGroup или Choose.

Пример

Следующий пример использует элементы Choose и When для обработки условий "либо-либо". Свойства и элементы для проекта задаются в зависимости от значения свойства 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>

В этом примере используется условие для константы компилятора DEFINED_CONSTANT. Настройки содержатся в свойстве DefinedConstants. Для сопоставления с конкретной константой в списке, элементы которого разделяются точкой с запятой, используется регулярное выражение.

<Choose>
   <When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(
         $(DefineConstants), '^(.*;)*DEFINED_CONSTANT(;.*)*$'))">
      <!-- When DEFINED_CONSTANT is defined. -->
   </When>
   <!-- other conditions -->
</Choose>

См. также