Условия MSBuild
MSBuild поддерживает определенный набор условий, которые можно применять везде Condition
, где разрешен атрибут; см. раздел "Поддерживаемые элементы". В следующей таблице описаны эти условия.
Условие | Description |
---|---|
'' == 'stringA stringB ' |
Принимает значение true , если stringA равна stringB .Например: Condition="'$(Configuration)'=='DEBUG'" Отдельные кавычки не требуются для простых буквенно-цифровых строк или логических значений. Но они необходимы для пустых значений. В этой проверке регистр не учитывается. |
'stringA' != 'stringB' |
Оценивается, true если stringA не равно stringB .Например: Condition="'$(Configuration)'!='DEBUG'" Отдельные кавычки не требуются для простых буквенно-цифровых строк или логических значений. Но они необходимы для пустых значений. В этой проверке регистр не учитывается. |
<, ><=, >= | Проверяет числовые значения операндов. Возвращает true , если отношение справедливо. Операнды должны быть десятичными или шестнадцатеричными числами или версиями из четырех частей, разделенных точками. Шестнадцатеричные числа должны начинаться с 0x . Примечание. В XML символы < и > следует записывать в виде escape-последовательностей. Символ < представляется в виде < . Символ > представляется в виде > . |
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. |
Элемент Condition
является одной строкой, поэтому все строки, используемые в выражении, включая значения свойств, должны быть заключены в одинарный кавычки. Пробелы между операторами разрешены и часто используются для удобочитаемости, но они не требуются.
Чтобы использовать логические And
и Or
операторы, укажите операнды внутри Condition
строкового значения элемента, как показано в следующем примере:
Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"
Логические операторы можно цепочки. Оператор 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