Podmínky nástroje MSBuild

NÁSTROJ MSBuild podporuje konkrétní sadu podmínek, které lze použít všude, kde Condition je povolen atribut; viz Podporované elementy. Tyto podmínky jsou vysvětleny v následující tabulce.

Podmínka Popis
'stringA' == '' 'stringB' Vyhodnotí se, true pokud stringA se rovná stringB.

Příklad:

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

Jednoduché uvozovky nejsou vyžadovány pro jednoduché alfanumerické řetězce nebo logické hodnoty. Jednoduché uvozovky jsou však vyžadovány pro prázdné hodnoty. Tato kontrola nerozlišuje malá a velká písmena.
'stringA' != 'stringB' Vyhodnotí se, true jestli stringA se nerovná stringB.

Příklad:

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

Jednoduché uvozovky nejsou vyžadovány pro jednoduché alfanumerické řetězce nebo logické hodnoty. Jednoduché uvozovky jsou však vyžadovány pro prázdné hodnoty. Tato kontrola nerozlišuje malá a velká písmena.
<, = ><> Vyhodnotí číselné hodnoty operandů. Vrátí true , pokud je relační vyhodnocení pravdivé. Operandy musí být vyhodnoceny jako desítkové nebo šestnáctkové číslo nebo čtyřdílné tečkované verze. Šestnáctková čísla musí začínat číslem 0x. Poznámka: Ve formátu XML musí být znaky < a > musí být uchycené. Symbol < je reprezentován jako &lt;. Symbol > je reprezentován jako &gt;.
Exists('stringA') Vyhodnotí se, true jestli existuje soubor nebo složka s názvem stringA .

Příklad:

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

Jednoduché uvozovky nejsou vyžadovány pro jednoduché alfanumerické řetězce nebo logické hodnoty. Jednoduché uvozovky jsou však vyžadovány pro prázdné hodnoty. Tato podmínka nerozbaluje zástupné dokumentace, například *.
HasTrailingSlash('stringA' Vyhodnotí se, true jestli zadaný řetězec obsahuje znak zpětného lomítka (\) nebo lomítka (/).

Příklad:

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

Jednoduché uvozovky nejsou vyžadovány pro jednoduché alfanumerické řetězce nebo logické hodnoty. Jednoduché uvozovky jsou však vyžadovány pro prázdné hodnoty.
! Vyhodnotí, true jestli se operand vyhodnotí jako false.
And Vyhodnotí, true jestli se oba operandy vyhodnotí jako true.
Or Vyhodnotí se, true jestli se alespoň jeden z operandů vyhodnotí jako true.
() Seskupovací mechanismus, který se vyhodnotí jako true výrazy obsažené uvnitř vyhodnocení .true
$if$ ( %expression% ), $else$, $endif$ Zkontroluje, jestli zadaný %expression% parametr odpovídá řetězcové hodnotě předaného parametru vlastní šablony. Pokud se $if$ podmínka vyhodnotí jako true, příkazy se spustí. V opačném případě se podmínka zkontroluje $else$ . $else$ Pokud je truepodmínka , příkazy jsou spuštěny; jinak podmínka ukončí vyhodnocení výrazu$endif$.

Příklady použití najdete v tématu Logika parametrů šablony projektu nebo položky sady Visual Studio.

Element Condition je jeden řetězec, a proto všechny řetězce, které se používají ve výrazu, včetně hodnot vlastností, musí být uzavřeny s jednoduchým uvozovkou. Mezery mezi operátory jsou povolené a běžně se používají pro čitelnost, ale nevyžadují se.

Pokud chcete použít logickou And hodnotu a Or operátory, zadejte operandy uvnitř Condition řetězcové hodnoty elementu, jak je znázorněno v následujícím příkladu:

Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"

Logické operátory můžete zřetězet. Operátor And má vyšší prioritu než Or, ale pro přehlednost doporučujeme použít závorky při použití více logických operátorů k explicitnímu pořadí vyhodnocení. Pokud ne, nástroj MSBuild zobrazí upozornění MSB4130.

Řetězcové metody můžete použít v podmínkách, jak je znázorněno v následujícím příkladu, ve kterém se funkce TrimEnd() používá k porovnání pouze relevantní části řetězce k rozlišení mezi cílovými architekturami .NET Framework a .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>

V souborech projektu MSBuild neexistuje žádný skutečný logický typ. Logická data jsou reprezentována ve vlastnostech, které můžou být prázdné nebo nastavené na libovolnou hodnotu. Proto znamená "pokud je trueprop", '$(Prop)' == 'true' ale '$(Prop)' != 'false' znamená "pokud prop je true nebo není nastavena na něco jiného".

Logická logika se vyhodnocuje pouze v kontextu podmínek, takže nastavení vlastností, jako <Prop2>'$(Prop1)' == 'true'</Prop> je například řetězec (po rozšíření proměnné), se nevyhodnocuje jako logické hodnoty.

NÁSTROJ MSBuild implementuje několik speciálních pravidel zpracování, která usnadňují práci s vlastnostmi řetězce, které se používají jako logické hodnoty. Logické literály jsou přijímány, takže Condition="true" a Condition="false" fungují podle očekávání. Nástroj MSBuild obsahuje také speciální pravidla pro podporu logického operátoru negace. $(Prop) Pokud je tedy pravda, !$(Prop) rozbalí !true a tato hodnota se porovná s tímfalse, jak byste očekávali.

Porovnání verzí

Relační operátory <, >, <=a >= podporují verze jako parsované System.Versionpodle , takže můžete porovnat verze, které mají čtyři číselné části navzájem. Například '1.2.3.4' < '1.10.0.0' je true.

Upozornění

System.Version porovnání mohou vést k překvapivým výsledkům, pokud jedna nebo obě verze nezadávají všechny čtyři části. Například verze 1.1 je starší než verze 1.1.0.

MSBuild poskytuje funkce vlastností pro porovnání verzí , které mají jinou sadu pravidel kompatibilní s sémantickou správou verzí (semver).

Rozšíření v podmínkách

V závislosti na pozici v souboru projektu můžete použít rozšíření pro vlastnosti ($), seznamy položek (@) a metadata položek (%). Rozšíření závisí na tom, jak MSBuild zpracovává soubory projektu.

Vlastnosti

Podmínka, která obsahuje výraz, jako $(SomeProperty) je vyhodnocen a převeden na hodnotu vlastnosti. Pokud je podmínka mimo cíl, výraz se vyhodnotí během vyhodnocení souboru projektu. Hodnota vlastnosti je závislá na pozici v souboru projektu po rozbalení všech importů. Pokud je podmínka v cíli, vyhodnotí se při spuštění cíle a hodnota bude ovlivněna všemi změnami, ke kterým dojde během provádění sestavení.

Vlastnost, která není definována v okamžiku v rozbaleném souboru projektu, kde se výraz podmínky vyskytuje, se vyhodnotí jako prázdný řetězec bez jakékoli diagnostické chyby nebo upozornění.

Seznamy položek

Podmínka, která obsahuje výraz @,jako @(SomeItems) je například rozbalený ve skupinách položek na nejvyšší úrovni a v cílech.

Položky můžou záviset na libovolné vlastnosti a mohou záviset na položkách, které jsou již definovány v posloupnosti.

Důvodem je, že NÁSTROJ MSBuild zpracovává soubory projektu v několika průchodech. Úspěšné vyhodnocení položky probíhá po počátečním vyhodnocení vlastnosti a rozšíření importu. Výrazy @-jsou proto povoleny v jakékoli podmínce, která se vyhodnotí po zahájení definování položek. To znamená, že v položkách, skupinách položek a v cílech.

Metadata

Podmínka, která obsahuje výraz metadat, jako %(ItemMetadata) je například rozbalený ve stejných kontextech jako seznamy položek, to znamená ve skupinách položek na nejvyšší úrovni a v cílech. Rozšíření ale může mít jiné chování ve skupině položek v závislosti na tom, jestli je skupina položek mimo cíl nebo uvnitř cíle. Kromě toho jsou povoleny různé formy výrazů metadat, %(ItemName.MetadataName)%(JustTheMetadataName), a @(ItemName->'%(MetadataName)'), pouze transformace položky (poslední) je povolena mimo cíl. Hodnota výrazu %-expression v cíli se vyhodnocuje za běhu a závisí na jakýchkoli změnách stavu během provádění cíle. Spuštění cíle a hodnoty libovolných výrazů %-expression obsažených v něm závisí také na dávkování cíle a může také aktivovat dávkování; viz dávkování nástroje MSBuild.

Podporované prvky

Atribut podporují Condition následující prvky:

  • Import
  • ImportGroup
  • Položka
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • Výstup
  • Vlastnost
  • PropertyGroup
  • Cíl
  • Úloha
  • UsingTask
  • Když

Viz také