MSBuild-Bedingungen

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

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

Zum 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' Ergibt true, wenn stringA ungleich stringB.

Zum 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 Escapezeichen 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.

Zum 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.
HasTrailingSlash('stringA') Ergibt true, wenn die angegebene Zeichenfolge entweder einen nachgestellten umgekehrten Schrägstrich (\) oder einen Schrägstrich (/) enthält.

Zum 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).

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 $(Prop) den Wert „true“ hat, wird !$(Prop) zu !true erweitert. Dies entspricht erwartungsgemäß 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 ergibt '1.2.3.4' < '1.10.0.0' den Wert 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.

Siehe auch