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 < . Symbol > je reprezentován jako > . |
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 true podmí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 true
prop", '$(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ž