Dela via


MSBuild-villkor

MSBuild stöder en specifik uppsättning villkor som kan tillämpas varhelst ett Condition attribut tillåts. se element som stöds. I följande tabell förklaras dessa villkor.

Tillstånd Beskrivning
'stringA' == 'stringB' Utvärderas till true om stringA är lika med stringB.

Till exempel:

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

Enkla citattecken krävs inte för enkla alfanumeriska strängar eller booleska värden. Enkla citattecken krävs dock för tomma värden. Den här kontrollen är skiftlägesokänslig.
'stringA' != 'stringB' Utvärderas till true om stringA inte är lika med stringB.

Till exempel:

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

Enkla citattecken krävs inte för enkla alfanumeriska strängar eller booleska värden. Enkla citattecken krävs dock för tomma värden. Den här kontrollen är skiftlägesokänslig.
<, >, <=, >= Utvärderar operandernas numeriska värden. Returnerar true om relationsutvärderingen är sann. Operander måste utvärderas till ett decimal- eller hexadecimalt tal eller en streckad version i fyra delar. Hexadecimala tal måste börja med 0x. Obs! I XML måste tecknen < och > vara undantagna. Symbolen < representeras som &lt;. Symbolen > representeras som &gt;.
Exists('stringA') Utvärderas till true om en fil eller mapp med namnet stringA finns.

Till exempel:

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

Enkla citattecken krävs inte för enkla alfanumeriska strängar eller booleska värden. Enkla citattecken krävs dock för tomma värden. Det här villkoret expanderar inte jokertecken som *.
HasTrailingSlash("stringA") Utvärderas till true om den angivna strängen innehåller antingen ett avslutande bakåtsnedstreck (\) eller snedstreck (/).

Till exempel:

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

Enkla citattecken krävs inte för enkla alfanumeriska strängar eller booleska värden. Enkla citattecken krävs dock för tomma värden.
! Utvärderar till true om operanden utvärderas till false.
And Utvärderas till true om båda operanderna utvärderas till true.
Or Utvärderas till true om minst en av operanderna utvärderas till true.
() Grupperingsmekanism som utvärderas till true om uttryck som ingår i utvärderas till true.
$if$ ( %expression% ), $else$, $endif$ Kontrollerar om den angivna %expression% matchar strängvärdet för den skickade anpassade mallparametern. Om $if$-villkoret utvärderas till truekörs dess instruktioner. annars kontrolleras $else$ villkoret. Om $else$ villkoret är truekörs dess instruktioner. annars avslutas uttrycksutvärderingen av det $endif$ villkoret.

Exempel på användning finns i Visual Studio-projekt-/objektmallparameterlogik.

Elementet Condition är en enda sträng, och därför måste alla strängar som används i uttrycket, inklusive runt egenskapsvärden, omges av ett enda citattecken. Mellanslag mellan operatorer tillåts och används ofta för läsbarhet, men de krävs inte.

Om du vill använda operatorerna Boolesk And och Or anger du operander i Condition-elementets strängvärde, som i följande exempel:

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

Du kan länka de booleska operatorerna. Operatorn And har högre prioritet än Or, men för tydlighetens skull rekommenderar vi att du använder parenteser när du använder flera booleska operatorer för att göra utvärderingsordningen explicit. Om du inte gör det varnar MSBuild MSB4130.

Du kan använda strängmetoder under förhållanden, som du ser i följande exempel, där funktionen TrimEnd() används för att endast jämföra den relevanta delen av strängen för att skilja mellan .NET Framework- och .NET Core-målramverk.

<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>

I MSBuild-projektfiler finns det ingen sann boolesk typ. Booleska data representeras i egenskaper som kan vara tomma eller inställda på valfritt värde. Därför betyder '$(Prop)' == 'true' "om Prop är true", men '$(Prop)' != 'false' betyder "om Prop true eller tas bort eller anges till något annat.".

Boolesk logik utvärderas endast i kontexten för villkor, så egenskapsinställningar som <Prop2>'$(Prop1)' == 'true'</Prop> representeras som en sträng (efter variabelexpansion), inte utvärderas som booleska värden.

MSBuild implementerar några särskilda bearbetningsregler för att göra det enklare att arbeta med strängegenskaper som används som booleska värden. Booleska literaler accepteras, så Condition="true" och Condition="false" fungerar som förväntat. MSBuild innehåller även särskilda regler som stöder den booleska negationsoperatorn. Om $(Prop) är "sant" expanderar !$(Prop) till !true och det här värdet jämförs lika med false, som förväntat.

Jämföra versioner

Relationsoperatorerna <, >, <=och >= stöder versioner som tolkas av System.Version, så att du kan jämföra versioner som har fyra numeriska delar med varandra. Till exempel är '1.2.3.4' < '1.10.0.0'true.

Försiktighet

System.Version jämförelser kan ge överraskande resultat när en eller båda versionerna inte anger alla fyra delarna. Version 1.1 är till exempel äldre än version 1.1.0.

MSBuild tillhandahåller egenskapsfunktioner för att jämföra versioner som har en annan uppsättning regler som är kompatibla med semantisk versionshantering (semver).

Expansioner under förhållanden

Beroende på positionen i projektfilen kan du använda expansioner för egenskaper ($), objektlistor (@) och objektmetadata (%). Expansionerna beror på hur MSBuild bearbetar projektfiler.

Egenskaper

Ett villkor som innehåller ett uttryck som $(SomeProperty) utvärderas och konverteras till egenskapsvärdet. Om villkoret ligger utanför ett mål utvärderas uttrycket under utvärderingen av projektfilen. Värdet för egenskapen är beroende av positionen i projektfilen efter att alla importer har expanderats. Om villkoret finns i ett mål utvärderas det när målet körs och värdet påverkas av eventuella ändringar som inträffar under körningen av bygget.

En egenskap som inte definieras vid den punkt i den expanderade projektfilen där villkorsuttrycket inträffar utvärderas till en tom sträng, utan diagnostikfel eller varning.

Objektlistor

Ett villkor som innehåller ett @-uttryck som @(SomeItems) expanderas i objektgrupper på den översta nivån och i mål.

Objekt kan vara beroende av vilken egenskap som helst och kan vara beroende av objekt som redan har definierats i följd.

Anledningen är att MSBuild bearbetar projektfiler i flera pass. Objektutvärderingspasset sker efter den första egenskapsutvärderingen och importexpansionen. Därför tillåts @-uttryck i alla villkor som utvärderas när objekt har börjat definieras. Det vill: i objekt, objektgrupper och i mål.

Metadata

Ett villkor som innehåller ett metadatauttryck som %(ItemMetadata) expanderas i samma kontexter som objektlistor, dvs. i objektgrupper på den översta nivån och i mål. Expansion kan dock ha olika beteende i en objektgrupp beroende på om objektgruppen ligger utanför ett mål eller inuti ett mål. Av de olika formerna av metadatauttryck tillåts %(ItemName.MetadataName), %(JustTheMetadataName)och @(ItemName->'%(MetadataName)')endast objekttransformering (den sista) utanför ett mål. Värdet för ett %-uttryck i ett mål utvärderas vid körning och beror på eventuella tillståndsändringar under målkörningen. Körningen av målet och värdet för alla %-uttryck som ingår i det är också beroende av batchbearbetningen av målet och kan även utlösa batchbearbetning. se MSBuild batchbearbetning.

Element som stöds

Följande element stöder attributet Condition:

  • Import
  • ImportGroup
  • Sak
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • Utdata
  • Egenskap
  • PropertyGroup
  • Mål
  • Uppgift
  • UsingTask
  • När

Se även