MSBuild-Bedingungen
MSBuild unterstützt einen bestimmten Satz von Bedingungen, die überall angewendet werden können, wo ein Condition
Attribut zulässig ist; siehe Unterstützte Elemente. In der folgenden Tabelle werden diese Bedingungen erläutert.
Zustand | Beschreibung |
---|---|
'stringA ' == 'stringB ' |
Wertet true aus, wenn stringA stringB entspricht.Zum Beispiel: Condition="'$(Configuration)'=='DEBUG'" Einfache Anführungszeichen sind für einfache alphanumerische Zeichenfolgen oder boolesche Werte nicht erforderlich. Für leere Werte sind jedoch einfache Anführungszeichen erforderlich. Bei dieser Überprüfung wird die Groß-/Kleinschreibung nicht beachtet. |
'stringA' != 'stringB' |
Wertet true aus, wenn stringA nicht gleich stringB ist.Zum Beispiel: Condition="'$(Configuration)'!='DEBUG'" Einfache Anführungszeichen sind für einfache alphanumerische Zeichenfolgen oder boolesche Werte nicht erforderlich. Für leere Werte sind jedoch einfache Anführungszeichen erforderlich. Bei dieser Überprüfung wird die Groß-/Kleinschreibung nicht beachtet. |
<, >, <=, >= | Werte der Operanden werden ausgewertet. Gibt true zurück, wenn die relationale Auswertung wahr ist. Operanden müssen eine dezimale oder hexadezimale Zahl oder eine vierteilige gepunktete Version auswerten. Hexadezimalzahlen müssen mit 0x beginnen.
Hinweis: In XML müssen die Zeichen < und > escaped sein. Das Symbol < wird als < dargestellt. Das Symbol > wird als > dargestellt. |
Exists('stringA ') |
Wertet aus, um true , wenn eine Datei oder ein Ordner mit dem Namen stringA vorhanden ist.Zum Beispiel: Condition="!Exists('$(Folder)')" Einfache Anführungszeichen sind für einfache alphanumerische Zeichenfolgen oder boolesche Werte nicht erforderlich. Für leere Werte sind jedoch einfache Anführungszeichen erforderlich. Diese Bedingung erweitert keine Wildcards wie * . |
HasTrailingSlash('stringA ') |
Ergibt true , wenn die angegebene Zeichenfolge entweder einen nachfolgenden Schrägstrich (\) oder schrägstrich (/) enthält.Zum Beispiel: Condition="!HasTrailingSlash('$(OutputPath)')" Einfache Anführungszeichen sind für einfache alphanumerische Zeichenfolgen oder boolesche Werte nicht erforderlich. Für leere Werte sind jedoch einfache Anführungszeichen erforderlich. |
! | Wird ausgewertet, um true , wenn der Operand false ausgewertet. |
And |
Wertet true aus, wenn beide Operanden als true ausgewertet werden. |
Or |
Wertet true aus, wenn mindestens einer der Operanden zu true ausgewertet wird. |
() | Gruppierungsmechanismus, der zu true ausgewertet wird, wenn ausdrücke, die in der Betreffenden enthalten sind, als true ausgewertet werden. |
$if$ ( %expression% ), $else$, $endif$ |
Überprüft, ob die angegebene %expression% dem Zeichenfolgenwert des übergebenen benutzerdefinierten Vorlagenparameters entspricht. Wenn die $if$ Bedingung als true ausgewertet wird, werden die Anweisungen ausgeführt; andernfalls wird die $else$ Bedingung überprüft. Wenn die $else$ Bedingung true ist, werden die Anweisungen ausgeführt; andernfalls endet die $endif$ Bedingung die Ausdrucksauswertung.Beispiele für die Verwendung finden Sie unter Visual Studio-Projekt-/Elementvorlagenparameterlogik. |
Das Condition
-Element ist eine einzelne Zeichenfolge, und daher müssen alle Zeichenfolgen, die im Ausdruck verwendet werden, einschließlich der Eigenschaftswerte, in ein einfaches Anführungszeichen eingeschlossen werden. Leerzeichen zwischen Operatoren sind zulässig und werden häufig zur Lesbarkeit verwendet, sind jedoch nicht erforderlich.
Wenn Sie die booleschen And
- und Or
operatoren verwenden möchten, geben Sie Operanden innerhalb des Zeichenfolgenwerts des Condition
Elements an, wie im folgenden Beispiel gezeigt:
Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"
Sie können die booleschen Operatoren verketten. Operator And
hat eine höhere Priorität als Or
. Aus Gründen der Klarheit wird jedoch empfohlen, Klammern zu verwenden, wenn Sie mehrere boolesche Operatoren verwenden, um die Reihenfolge der Auswertung explizit festzulegen. Andernfalls gibt MSBuild Warnungen MSB4130.
Sie können Zeichenfolgenmethoden in Bedingungen verwenden, wie im folgenden Beispiel gezeigt, in dem die TrimEnd()-Funktion verwendet wird, um nur den relevanten Teil der Zeichenfolge zu vergleichen, um zwischen .NET Framework und .NET Core-Zielframeworks zu unterscheiden.
<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-Projektdateien gibt es keinen echten booleschen Typ. Boolesche Daten werden in Eigenschaften dargestellt, die leer oder auf einen beliebigen Wert festgelegt sind. Daher bedeutet '$(Prop)' == 'true'
"wenn Prop true
ist", aber '$(Prop)' != 'false'
bedeutet "wenn Prop true
oder nicht festgelegt ist oder auf etwas anderes festgelegt ist."
Boolesche Logik wird nur im Kontext von Bedingungen ausgewertet, sodass Eigenschaftseinstellungen wie <Prop2>'$(Prop1)' == 'true'</Prop>
als Zeichenfolge (nach variabler Erweiterung) dargestellt werden, nicht als boolesche Werte ausgewertet werden.
MSBuild implementiert einige spezielle Verarbeitungsregeln, um die Arbeit mit Zeichenfolgeneigenschaften zu vereinfachen, die als boolesche Werte verwendet werden. Boolesche Literale werden akzeptiert, sodass Condition="true"
und Condition="false"
wie erwartet funktionieren. MSBuild enthält auch spezielle Regeln zur Unterstützung des booleschen Negationsoperators. Wenn $(Prop)
also "true" ist, wird !$(Prop)
auf !true
erweitert, und dieser Wert wird mit false
verglichen, wie Sie es erwarten würden.
Vergleichen von Versionen
Die relationalen Operatoren <
, >
, <=
und >=
unterstützen Versionen, die von System.Versionanalysiert werden, sodass Sie Versionen mit vier numerischen Teilen miteinander vergleichen können. Beispielsweise ist '1.2.3.4' < '1.10.0.0'
true
.
Vorsicht
System.Version
Vergleiche können überraschende Ergebnisse erzielen, wenn eine oder beide Versionen nicht alle vier Teile angeben. Version 1.1 ist beispielsweise älter als Version 1.1.0.
MSBuild bietet Eigenschaftenfunktionen zum Vergleichen von Versionen mit einem anderen Satz von Regeln, die mit der semantischen Versionsverwaltung (semver) kompatibel sind.
Erweiterungen in Bedingungen
Abhängig von der Position in der Projektdatei können Sie Erweiterungen für Eigenschaften ($), Elementlisten (@) und Elementmetadaten (%) verwenden. Die Erweiterungen hängen davon ab, wie MSBuild Projektdateienverarbeitet.
Eigenschaften
Eine Bedingung, die einen Ausdruck wie $(SomeProperty)
enthält, wird ausgewertet und in den Eigenschaftswert konvertiert. Wenn sich die Bedingung außerhalb eines Ziels befindet, wird der Ausdruck während der Auswertung der Projektdatei ausgewertet. Der Wert der Eigenschaft hängt von der Position in der Projektdatei ab, nachdem alle Importe erweitert wurden. Wenn sich die Bedingung in einem Ziel befindet, wird sie ausgewertet, wenn das Ziel ausgeführt wird, und der Wert wird von allen Änderungen beeinflusst, die während der Ausführung des Builds auftreten.
Eine Eigenschaft, die an dem Punkt in der erweiterten Projektdatei nicht definiert ist, in der der Bedingungsausdruck auftritt, wird ohne Diagnosefehler oder Warnung in eine leere Zeichenfolge ausgewertet.
Elementlisten
Eine Bedingung, die einen @-Ausdruck wie @(SomeItems)
enthält, wird in Elementgruppen auf oberster Ebene und in Zielen erweitert.
Elemente können von jeder Eigenschaft abhängen und von Elementen abhängen, die bereits in Sequenz definiert sind.
Der Grund dafür ist, dass MSBuild Projektdateien in mehreren Durchläufen verarbeitet. Der Elementauswertungsdurchlauf tritt nach der anfänglichen Eigenschaftsauswertung und dem Importerweiterungsdurchlauf auf. Daher sind @-Ausdrücke in jeder Bedingung zulässig, die ausgewertet wird, nachdem Elemente definiert wurden. Das heißt in Elementen, Elementgruppen und zielen.
Metadaten
Eine Bedingung, die einen Metadatenausdruck wie %(ItemMetadata)
enthält, wird in denselben Kontexten wie Elementlisten erweitert, d. h. in Elementgruppen auf oberster Ebene und in Zielen. Die Erweiterung kann jedoch ein anderes Verhalten in einer Elementgruppe aufweisen, je nachdem, ob sich die Elementgruppe außerhalb eines Ziels oder innerhalb eines Ziels befindet. Außerdem sind die verschiedenen Formen von Metadatenausdrücken, %(ItemName.MetadataName)
, %(JustTheMetadataName)
und @(ItemName->'%(MetadataName)')
nur die Elementtransformation (die letzte) außerhalb eines Ziels zulässig. Der Wert eines %-Ausdrucks in einem Ziel wird zur Laufzeit ausgewertet und hängt von allen Zustandsänderungen während der Zielausführung ab. Die Ausführung des Ziels und der Wert aller darin enthaltenen %-Ausdrücke hängt auch von der Batchverarbeitung des Ziels ab und kann auch die Batchverarbeitung auslösen; siehe MSBuild Batching.
Unterstützte Elemente
Die folgenden Elemente unterstützen das attribut Condition
:
- Importieren
- ImportGroup
- Artikel
- ItemDefinitionGroup
- ItemGroup
- ItemMetadata
- OnError
- Ausgabe
- Eigentum
- PropertyGroup
- Ziel
- Aufgabe
- UsingTask
- Wann