MSBuild-voorwaarden
MSBuild ondersteunt een specifieke set voorwaarden die kunnen worden toegepast waar een Condition
kenmerk is toegestaan; zie Ondersteunde elementen. In de volgende tabel worden deze voorwaarden uitgelegd.
Conditie | Beschrijving |
---|---|
'stringA ' == 'stringB ' |
Evalueert naar true als stringA gelijk is aan stringB .Bijvoorbeeld: Condition="'$(Configuration)'=='DEBUG'" Enkele aanhalingstekens zijn niet vereist voor eenvoudige alfanumerieke tekenreeksen of booleaanse waarden. Enkele aanhalingstekens zijn echter vereist voor lege waarden. Deze controle is niet hoofdlettergevoelig. |
'stringA' != 'stringB' |
Evalueert of true als stringA niet gelijk is aan stringB .Bijvoorbeeld: Condition="'$(Configuration)'!='DEBUG'" Enkele aanhalingstekens zijn niet vereist voor eenvoudige alfanumerieke tekenreeksen of booleaanse waarden. Enkele aanhalingstekens zijn echter vereist voor lege waarden. Deze controle is niet hoofdlettergevoelig. |
<, >, <=, >= | Evalueert de numerieke waarden van de operanden. Retourneert true als de relationele evaluatie waar is. Operanden moeten een decimaal of hexadecimaal getal of een vierdelige gestippelde versie evalueren. Hexadecimale getallen moeten beginnen met 0x .
Opmerking: In XML moeten de tekens < en > worden ontsnapt. Het symbool < wordt weergegeven als < . Het symbool > wordt weergegeven als > . |
Exists('stringA ') |
Evalueert of er een bestand of map met de naam stringA bestaat true .Bijvoorbeeld: Condition="!Exists('$(Folder)')" Enkele aanhalingstekens zijn niet vereist voor eenvoudige alfanumerieke tekenreeksen of booleaanse waarden. Enkele aanhalingstekens zijn echter vereist voor lege waarden. Met deze voorwaarde worden geen jokertekens zoals * uitgevouwen. |
HasTrailingSlash('stringA ') |
Hiermee wordt true als de opgegeven tekenreeks een achterwaartse slash (\) of slash (/) bevat.Bijvoorbeeld: Condition="!HasTrailingSlash('$(OutputPath)')" Enkele aanhalingstekens zijn niet vereist voor eenvoudige alfanumerieke tekenreeksen of booleaanse waarden. Enkele aanhalingstekens zijn echter vereist voor lege waarden. |
! | Evalueert naar true als de operand resulteert in false . |
And |
Evalueert naar true als beide operanden true . |
Or |
Evalueert tot true als ten minste één van de operanden true . |
() | Groepeermechanisme dat resulteert in true als expressies die zijn opgenomen in true . |
$if$ ( %expression% ), $else$, $endif$ |
Controleert of de opgegeven %expression% overeenkomt met de tekenreekswaarde van de doorgegeven aangepaste sjabloonparameter. Als de $if$ voorwaarde resulteert in true , worden de instructies uitgevoerd; anders wordt de $else$ voorwaarde gecontroleerd. Als de $else$ voorwaarde is true , worden de instructies uitgevoerd; anders beëindigt de $endif$ voorwaarde de expressie-evaluatie.Zie Visual Studio-project-/itemsjabloonparameterlogicavoor voorbeelden van gebruik. |
Het element Condition
is één tekenreeks en dus moeten alle tekenreeksen die worden gebruikt in de expressie, inclusief rond eigenschapswaarden, worden ingesloten met één aanhalingsteken. Spaties tussen operators zijn toegestaan en worden vaak gebruikt voor leesbaarheid, maar ze zijn niet vereist.
Als u de booleaanse operatoren And
en Or
wilt gebruiken, geeft u operanden op binnen de tekenreekswaarde van het Condition
-element, zoals in het volgende voorbeeld:
Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"
U kunt de Booleaanse operatoren koppelen. Operator And
heeft een hogere prioriteit dan Or
, maar voor de duidelijkheid raden we u aan haakjes te gebruiken wanneer u meerdere Booleaanse operatoren gebruikt om de volgorde van de evaluatie expliciet te maken. Als u dat niet doet, geeft MSBuild een waarschuwing MSB4130.
U kunt tekenreeksmethoden gebruiken in voorwaarden, zoals wordt weergegeven in het volgende voorbeeld, waarin de functie TrimEnd() wordt gebruikt om alleen het relevante deel van de tekenreeks te vergelijken, om onderscheid te maken tussen .NET Framework- en .NET Core-doelframeworks.
<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>
In MSBuild-projectbestanden is er geen echt Booleaanse type. Booleaanse gegevens worden weergegeven in eigenschappen die leeg kunnen zijn of kunnen worden ingesteld op een willekeurige waarde. Daarom betekent '$(Prop)' == 'true'
'als Prop true
is', maar '$(Prop)' != 'false'
betekent 'als Prop true
is of is ingesteld op iets anders'.
Booleaanse logica wordt alleen geëvalueerd in de context van voorwaarden, dus eigenschapsinstellingen zoals <Prop2>'$(Prop1)' == 'true'</Prop>
worden weergegeven als een tekenreeks (na variabele uitbreiding), niet geëvalueerd als Booleaanse waarden.
MSBuild implementeert een aantal speciale verwerkingsregels om het gemakkelijker te maken om te werken met tekenreekseigenschappen die worden gebruikt als Booleaanse waarden. Booleaanse letterlijke waarden worden geaccepteerd, dus Condition="true"
en Condition="false"
werken zoals verwacht. MSBuild bevat ook speciale regels ter ondersteuning van de Booleaanse negatieoperator. Dus als $(Prop)
'true' is, wordt !$(Prop)
uitgebreid naar !true
en vergelijkt deze waarde gelijk aan false
, zoals u zou verwachten.
Versies vergelijken
De relationele operators <
, >
, <=
en >=
ondersteuning bieden voor versies die worden geparseerd door System.Version, zodat u versies met vier numerieke delen met elkaar kunt vergelijken.
'1.2.3.4' < '1.10.0.0'
is bijvoorbeeld true
.
Voorzichtigheid
System.Version
vergelijkingen kunnen verrassende resultaten opleveren wanneer een of beide versies niet alle vier de onderdelen opgeven. Versie 1.1 is bijvoorbeeld ouder dan versie 1.1.0.
MSBuild biedt eigenschapsfuncties om versies te vergelijken die een andere set regels hebben die compatibel zijn met semantische versiebeheer (semver).
Uitbreidingen in voorwaarden
Afhankelijk van de positie in het projectbestand kunt u uitbreidingen gebruiken voor eigenschappen ($), itemlijsten (@) en metagegevens van items (%). De uitbreidingen zijn afhankelijk van hoe MSBuild projectbestandenverwerkt.
Eigenschappen
Een voorwaarde die een expressie zoals $(SomeProperty)
bevat, wordt geëvalueerd en geconverteerd naar de eigenschapswaarde. Als de voorwaarde buiten een doel valt, wordt de expressie geëvalueerd tijdens de evaluatie van het projectbestand. De waarde van de eigenschap is afhankelijk van de positie in het projectbestand nadat alle importbewerkingen zijn uitgebreid. Als de voorwaarde zich in een doel bevindt, wordt deze geëvalueerd wanneer het doel wordt uitgevoerd en wordt de waarde beïnvloed door eventuele wijzigingen die optreden tijdens de uitvoering van de build.
Een eigenschap die niet is gedefinieerd op het punt in het uitgevouwen projectbestand waarin de voorwaardeexpressie optreedt, resulteert in een lege tekenreeks, zonder diagnostische fout of waarschuwing.
Itemlijsten
Een voorwaarde die een @-expressie zoals @(SomeItems)
bevat, wordt uitgebreid in itemgroepen op het hoogste niveau en in doelen.
Items kunnen afhankelijk zijn van elke eigenschap en kunnen afhankelijk zijn van items die al op volgorde zijn gedefinieerd.
De reden hiervoor is dat MSBuild projectbestanden in verschillende passen verwerkt. De evaluatie van het item vindt plaats na de eerste evaluatie van eigenschappen en het importeren van uitbreidingspas. Daarom zijn @-expressies toegestaan in elke voorwaarde die wordt geëvalueerd nadat items zijn gedefinieerd. Dat wil gezegd, in items, itemgroepen en in doelen.
Metagegevens
Een voorwaarde die een metagegevensexpressie zoals %(ItemMetadata)
bevat, wordt uitgevouwen in dezelfde contexten als itemlijsten, dus in itemgroepen op het hoogste niveau en in doelen. Uitbreiding kan echter verschillend gedrag hebben in een itemgroep, afhankelijk van of de itemgroep zich buiten een doel of binnen een doel bevindt. Van de verschillende vormen van metagegevensexpressies, %(ItemName.MetadataName)
, %(JustTheMetadataName)
en @(ItemName->'%(MetadataName)')
, is alleen de itemtransformatie (de laatste) buiten een doel toegestaan. De waarde van een %-expression in een doel wordt tijdens runtime geëvalueerd en is afhankelijk van eventuele statuswijzigingen tijdens de uitvoering van het doel. De uitvoering van het doel en de waarde van alle %-expressies in het doel is ook afhankelijk van de batchverwerking van het doel en kan ook batchverwerking activeren; zie MSBuild batching.
Ondersteunde elementen
De volgende elementen ondersteunen het kenmerk Condition
:
- Importeren
- ImportGroup
- Item
- ItemDefinitionGroup
- ItemGroup
- ItemMetadata
- OnError
- Uitvoer
- Eigenschap
- PropertyGroup
- Doel
- Taak
- UsingTask
- Wanneer