Условия MSBuild

MSBuild поддерживает определенный набор условий, которые можно применять везде Condition , где разрешен атрибут; см. раздел "Поддерживаемые элементы". В следующей таблице описаны эти условия.

Условие Description
'' == 'stringAstringB' Принимает значение true, если stringA равна stringB.

Например:

Condition="'$(Configuration)'=='DEBUG'"

Отдельные кавычки не требуются для простых буквенно-цифровых строк или логических значений. Но они необходимы для пустых значений. В этой проверке регистр не учитывается.
'stringA' != 'stringB' Оценивается, true если stringA не равно stringB.

Например:

Condition="'$(Configuration)'!='DEBUG'"

Отдельные кавычки не требуются для простых буквенно-цифровых строк или логических значений. Но они необходимы для пустых значений. В этой проверке регистр не учитывается.
<, ><=, >= Проверяет числовые значения операндов. Возвращает true, если отношение справедливо. Операнды должны быть десятичными или шестнадцатеричными числами или версиями из четырех частей, разделенных точками. Шестнадцатеричные числа должны начинаться с 0x. Примечание. В XML символы < и > следует записывать в виде escape-последовательностей. Символ < представляется в виде &lt;. Символ > представляется в виде &gt;.
Exists('stringA') Принимает значение true, если файл или папка с именем stringA существует.

Например:

Condition="!Exists('$(Folder)')"

Отдельные кавычки не требуются для простых буквенно-цифровых строк или логических значений. Но они необходимы для пустых значений. Это условие не расширяет дикие карта например*.
HasTrailingSlash('stringA') Принимает значение true, если указанная строка содержит завершающий символ обратной косой черты (\) или символ прямой косой черты (/).

Например:

Condition="!HasTrailingSlash('$(OutputPath)')"

Отдельные кавычки не требуются для простых буквенно-цифровых строк или логических значений. Но они необходимы для пустых значений.
! Принимает значение true, если операнд имеет значение false.
And Принимает значение true, если оба операнда имеют значение true.
Or Принимает значение true, если по крайней мере один операнд имеет значение true.
() Механизм группирования. Результат принимает значение true, если выражения, содержащиеся внутри, имеют значение true.
$if$ ( %expression% ), $else$, $endif$ Проверяет, равняется ли значение указанного %expression% строковому значению переданного параметра пользовательского шаблона. Если результат проверки условия $if$ принимает значение true, его операторы выполняются, в противном случае проверяется условие $else$. Если результат проверки условия $else$ принимает значение true, его операторы выполняются, в противном случае условие $endif$ завершает проверку выражений.

Примеры использования см. в разделе Логика параметра-шаблона проекта или элемента Visual Studio.

Оператор And имеет более высокий приоритет, чем Or, но для ясности рекомендуется использовать скобки при использовании нескольких логических операторов, чтобы сделать порядок вычисления явным. Если вы этого не сделали, MSBuild выдает предупреждение MSB4130.

Вы можете использовать методы строк в условиях, как показано в следующем примере, где функция TrimEnd() используется для сравнения только релевантной части строки, чтобы можно было различать целевые платформы .NET Framework и .NET Core.

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFrameworks>net45;net48;netstandard2.1;netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
    </PropertyGroup>

    <PropertyGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
        <!-- Properties for .NET Framework -->
    </PropertyGroup>

</Project>

В файлах проекта MSBuild отсутствует истинный логический тип. Логические данные представлены в свойствах, которые могут быть пустыми или иметь любое значение. Поэтому '$(Prop)' == 'true' означает "если Prop имеет значение true", но '$(Prop)' != 'false' означает "если Prop имеет значение true, не задано или имеет другое значение".

Булева логика оценивается только в контексте условий, поэтому настройки свойств, такие как <Prop2>'$(Prop1)' == 'true'</Prop>, представлены в виде строки (после расширения переменной), а не оцениваются в качестве логических значений.

В MSBuild реализовано несколько правил обработки, которые упрощают работу со свойствами строки, используемыми в качестве логических значений. Логические литералы принимаются, поэтому Condition="true" и Condition="false" работают надлежащим образом. MSBuild также включает специальные правила для поддержки оператора логического отрицания. Таким образом, если $(Prop) значение равно true, !$(Prop) расширяется и !true это значение сравнивается с falseравным, как и ожидалось.

Сравнение версий

Реляционные операторы <,>, <= и >= поддерживают версии, проанализированные с помощью System.Version, что позволяют сравнивать версии, состоящие из четырех числовых частей. Например, '1.2.3.4' < '1.10.0.0' имеет значение true.

Внимание

Сравнения System.Version могут выдавать неожиданные результаты, если одна версия или обе не указывают все четыре части. Например, версия 1.1 старше версии 1.1.0.

MSBuild предоставляет функции свойств для сравнения версий с различными наборами правил, совместимыми с семантическими версиями (semver).

Расширения в условиях

В зависимости от позиции в файле проекта можно использовать расширения для свойств ($), списков элементов (@) и метаданных элементов (%). Расширения зависят от того, как MSBuild обрабатывает файлы проекта.

Свойства

Условие, содержащее выражение, например $(SomeProperty) вычисляемое и преобразованное в значение свойства. Если условие находится за пределами целевого объекта, выражение вычисляется во время оценки файла проекта. Значение свойства зависит от позиции в файле проекта после расширения всех импортов. Если условие находится в целевом объекте, оно оценивается при выполнении целевого объекта, а значение влияет на любые изменения, происходящие во время выполнения сборки.

Свойство, которое не определено в точке в развернутом файле проекта, где выражение условия оценивается в пустую строку без каких-либо диагностических ошибок или предупреждений.

Списки элементов

Условие, содержащее выражение @-expression, например @(SomeItems) развернутое в группах элементов на верхнем уровне и в целевых объектах.

Элементы могут зависеть от любого свойства и могут зависеть от элементов, которые уже определены в последовательности.

Причина заключается в том, что MSBuild обрабатывает файлы проекта несколькими проходами. После начальной оценки свойства и прохождения расширения импорта выполняется проверка элемента. Таким образом, @-expressions разрешены в любом условии, которое вычисляется после того, как элементы начали определяться. То есть в элементах, группах элементов и в целевых объектах.

Метаданные

Условие, содержащее выражение метаданных, например развернутое в том же контексте, что %(ItemMetadata) и списки элементов, то есть в группах элементов на верхнем уровне и в целевых объектах. Однако расширение может иметь другое поведение в группе элементов в зависимости от того, находится ли группа элементов вне целевого объекта или внутри целевого объекта. Кроме того, из различных форм выражений метаданных, %(ItemName.MetadataName)%(JustTheMetadataName)и , а @(ItemName->'%(MetadataName)')также только преобразование элемента (последнее) допускается за пределами целевого объекта. Значение %-expression в целевом объекте вычисляется во время выполнения и зависит от любых изменений состояния во время выполнения целевого объекта. Выполнение целевого объекта и значения любых %-выражений, содержащихся в нем, также зависит от пакетирования целевого объекта, а также может активировать пакетную обработку; см. пакетную обработку MSBuild.

Поддерживаемые элементы

Следующие элементы поддерживают Condition атрибут:

  • Import
  • ImportGroup
  • Товар
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • Выходные данные
  • Свойство
  • PropertyGroup
  • Назначение
  • Задача
  • UsingTask
  • When

См. также