MSBuild-Bedingungen

MSBuild unterstützt bestimmte Bedingungen, die angewendet werden können, wenn ein Condition-Attribut zulässig ist. Siehe Unterstützte Elemente. Diese Bedingungen sind in der folgenden Tabelle angegeben.

Bedingung Beschreibung
'stringA' == 'stringB' Ergibt true, wenn stringA gleich stringB.

Beispiel:

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

Für einfache alphanumerische Zeichenfolgen und boolesche Werte sind keine einfachen Anführungszeichen erforderlich. Allerdings sind einfache Anführungszeichen für leere Werte erforderlich. Bei dieser Überprüfung wird die Groß-/Kleinschreibung nicht berücksichtigt.
'stringA' != 'stringB' Wird zu true ausgewertet, wenn stringA nicht gleich stringB ist.

Beispiel:

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

Für einfache alphanumerische Zeichenfolgen und boolesche Werte sind keine einfachen Anführungszeichen erforderlich. Allerdings sind einfache Anführungszeichen für leere Werte erforderlich. Bei dieser Überprüfung wird die Groß-/Kleinschreibung nicht berücksichtigt.
<, , ><=, >= Wertet die numerischen Werte der Operanden aus. Gibt true aus, wenn die relationale Auswertung TRUE ist. Die Auswertung von Operanden muss eine dezimale oder hexadezimale Zahl oder eine vierteilige gepunktete Version ergeben. Hexadezimale Zahlen müssen mit 0x beginnen. Hinweis: Im XML müssen die Zeichen < und > mit Escape-Zeichen versehen werden. Das Symbol < wird als &lt; dargestellt. Das Symbol > wird als &gt; dargestellt.
Exists('stringA') Ergibt true, wenn eine Datei oder ein Ordner mit dem Namen stringA vorhanden ist.

Beispiel:

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

Für einfache alphanumerische Zeichenfolgen und boolesche Werte sind keine einfachen Anführungszeichen erforderlich. Allerdings sind einfache Anführungszeichen für leere Werte erforderlich. Diese Bedingung erweitert keine Wildcards wie z. B. *.
HasTrailingSlash('stringA') Ergibt true, wenn die angegebene Zeichenfolge entweder einen nachgestellten umgekehrten Schrägstrich (\) oder einen Schrägstrich (/) enthält.

Beispiel:

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

Für einfache alphanumerische Zeichenfolgen und boolesche Werte sind keine einfachen Anführungszeichen erforderlich. Allerdings sind einfache Anführungszeichen für leere Werte erforderlich.
! Ergibt true, wenn die Auswertung des Operanden false ergibt.
And Ergibt true, wenn die Auswertung beider Operanden true ergibt.
Or Ergibt true, wenn die Auswertung von mindestens einem Operanden true ergibt.
() Gruppierungsmechanismus, dessen Auswertung true ergibt, wenn die Auswertung der darin enthaltenen Ausdrücke true ergibt.
$if$ ( %expression% ), $else$, $endif$ Überprüft, ob das angegebene %expression% dem Zeichenfolgenwert des übergebenen benutzerdefinierten Vorlagenparameters entspricht. Wenn die Auswertung der $if$-Bedingung true ergibt, werden die jeweiligen Anweisungen ausgeführt. Andernfalls wird die $else$-Bedingung überprüft. Wenn die Auswertung der $else$-Bedingung true ergibt, werden die jeweiligen Anweisungen ausgeführt. Andernfalls beendet die $endif$-Bedingung die Auswertung des Ausdrucks.

Anwendungsbeispiele finden Sie unter Visual Studio project/item template parameter logic (Visual Studio-Projekt: Parameterlogik in Elementvorlagen).

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.

Um boolesche And Und Or Operatoren zu verwenden, 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. Der Operator And hat eine höhere Priorität als Or, aber aus Gründen der Klarheit wird empfohlen, Klammern zu verwenden, wenn Sie mehrere boolesche Operatoren verwenden, um die Reihenfolge der Auswertung explizit festzulegen. Andernfalls gibt MSBuild die Warnung „MSB4130“ aus.

Sie können Zeichenfolgenmethoden in Bedingungen wie im folgenden Beispiel gezeigt verwenden, bei der die TrimEnd()-Funktion zum Vergleichen des relevanten Teils der Zeichenfolge verwendet wird, 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 möglicherweise 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 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 der Variablenerweiterung) dargestellt und nicht als boolesche Werte ausgewertet werden.

MSBuild implementiert einige besondere Verarbeitungsregeln, um die Arbeit mit Zeichenfolgeneigenschaften zu vereinfachen, die als boolesche Werte verwendet werden. Boolesche Literale werden akzeptiert, sodass Condition="true" und Condition="false" erwartungsgemäß funktionieren. MSBuild enthält auch spezielle Regeln, um den booleschen Negationsoperator zu unterstützen. Wenn also $(Prop) „WAHR“ ist, wird !$(Prop) zu !true erweitert, und dieser Wert ist erwartungsgemäß gleich false.

Vergleichen von Versionen

Die relationalen Operatoren <, >, <= und >= unterstützen Versionen, wie sie von System.Version analysiert werden, sodass Sie Versionen miteinander vergleichen können, die vier numerische Teile aufweisen. Beispielsweise ist '1.2.3.4' < '1.10.0.0' gleich true.

Achtung

System.Version-Vergleiche können zu überraschenden Ergebnissen führen, wenn für eine oder beide Versionen nicht alle vier Teile angegeben sind. Beispielsweise ist Version 1.1 älter als Version 1.1.0.

MSBuild stellt Eigenschaftenfunktionen zum Vergleichen von Versionen bereit, die über andere Regeln verfügen, die mit der semantischen Versionierung (semver) kompatibel sind.

Erweiterungen unter 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 Projektdateien verarbeitet.

Eigenschaften

Eine Bedingung, die einen Ausdruck enthält (z. B. $(SomeProperty)), 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 ist von der Position in der Projektdatei abhängig, nachdem alle Importe erweitert wurden. Wenn sich die Bedingung in einem Ziel befindet, wird sie ausgewertet, wenn das Ziel ausgeführt wird. Der Wert wird von allen Änderungen beeinflusst, die während der Ausführung des Builds auftreten.

Eine Eigenschaft, die nicht an dem Punkt in der erweiterten Projektdatei definiert ist, an dem der Bedingungsausdruck steht, wird ohne Diagnosefehler oder Warnung als leere Zeichenfolge ausgewertet.

Elementlisten

Eine Bedingung, die einen @-Ausdruck enthält (z. B. @(SomeItems)), wird in Elementgruppen auf der obersten Ebene und in Zielen erweitert.

Elemente können von jeder Eigenschaft und von Elementen abhängen, die bereits in der Sequenz definiert sind.

Der Grund ist, dass MSBuild Projektdateien in mehreren Durchläufen verarbeitet. Der Durchlauf zur Elementauswertung erfolgt nach den anfänglichen Durchläufen zur Eigenschaftenauswertung und zur Importerweiterung. Daher sind @-Ausdrücke in jeder Bedingung zulässig, die ausgewertet wird, nachdem die Definition von Elementen begonnen wurde. Das heißt in Elementen, Elementgruppen und Zielen.

Metadaten

Eine Bedingung, die einen Metadatenausdruck enthält (z. B. %(ItemMetadata)), wird in denselben Kontexten wie Elementlisten erweitert, d. h. in Elementgruppen auf oberster Ebene und in Zielen. Die Erweiterung kann sich jedoch in einer Elementgruppe anders verhalten, je nachdem, ob sich die Elementgruppe außerhalb oder innerhalb eines Ziels befindet. Außerdem ist von den 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 der darin enthaltenen %-Ausdrücke hängen ebenfalls von der Batchverarbeitung des Ziels ab und können ebenfalls eine Batchverarbeitung auslösen. Weitere Informationen finden Sie unter MSBuild-Batchverarbeitung.

Unterstützte Elemente

Die folgenden Elemente unterstützen das Condition-Attribut:

  • Importieren
  • ImportGroup
  • Element
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • Output
  • Eigenschaft
  • PropertyGroup
  • Ziel
  • Aufgabe
  • UsingTask
  • When

Siehe auch