MSBuild の条件

MSBuild では、Condition 属性が許可されている場所ならどこでも適用できる、特定の条件のセットがサポートされています。 次の表は、その条件を説明したものです。

条件 説明
'stringA' == 'stringB' stringAstringB に等しい場合、true と評価されます。

次に例を示します。

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

単純な英数字文字列またはブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。 この確認では、大文字と小文字が区別されません。
'stringA' != 'stringB' stringAstringB と等しくない場合、true と評価されます。

次に例を示します。

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

単純な英数字文字列またはブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。 この確認では、大文字と小文字が区別されません。
<, >, <=, >= オペランドの数値を評価します。 関係の評価が true の場合、true を返します。 オペランドは、10 進数または 16 進数、またはドット付きの 4 つの部分のバージョンに評価される必要があります。 16 進数は、"0 x" で始まる必要があります。 注: XML では、文字 < および > をエスケープする必要があります。 シンボル < は、&lt; として表されます。 シンボル > は、&gt; として表されます。
Exists('stringA') stringA という名前のファイルまたはフォルダーが存在する場合、true と評価されます。

次に例を示します。

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

単純な英数字文字列またはブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。
HasTrailingSlash('stringA') 指定した文字列の末尾にバックスラッシュ (\) 文字かスラッシュ (/) 文字のいずれかが含まれる場合、true と評価されます。

次に例を示します。

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

単純な英数字文字列またはブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。
! オペランドが false と評価される場合、true と評価されます。
And 両方のオペランドが true と評価される場合、true と評価します。
Or 少なくともオペランドの 1 つが true と評価される場合、true と評価します。
() 内部に含まれる式が true と評価される場合に true と評価されるグループ化機構。
$if$ ( %expression% )、$else$、$endif$ 指定した %expression% が、渡されるカスタム テンプレート パラメーターの文字列の値と一致するかどうかをチェックします。 $if$ 条件が true と評価される場合、そのステートメントが実行されます。それ以外の場合、$else$ 条件がチェックされます。 $else$ 条件が true の場合、そのステートメントが実行されます。それ以外の場合、$endif$ 条件は式の評価を終了します。

使用の例については、「Visual Studio Project/Item Template Parameter Logic」(Visual Studio プロジェクト/項目テンプレート パラメーター ロジック) を参照してください。

次の例に示すように、文字列メソッドを条件で使用できます。ここでは、文字列の関連部分のみを比較するために TrimEnd() 関数を使用し、.NET Framework と .NET Core のターゲット フレームワークを区別しています。

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

MSBuild プロジェクト ファイルには、真のブール型は存在しません。 ブール型のデータは、空や任意の値に設定したプロパティで表します。 したがって、'$(Prop)' == 'true' は "Prop が true である場合" を意味しますが、'$(Prop)' != 'false' は "Prop が true、未設定、または別のものに設定されている場合" を意味します。

ブール値のロジックは条件のコンテキストでのみ評価されるので、<Prop2>'$(Prop1)' == 'true'</Prop> などのプロパティ設定は、ブール値として評価されるのではなく、文字列として表されます (変数の展開後)。

ブール値として使用する文字列プロパティを操作しやすくするために、MSBuild にはいくつかの特別な処理規則が実装されています。 ブール型リテラルは許容されます。そのため、Condition="true"Condition="false" は期待どおりに動作します。 MSBuild には、ブール型の否定演算子をサポートする特殊な規則も含まれています。 $(Prop) が 'true' の場合、!$(Prop)!true に展開され、想定どおり false と等価になります。

バージョンの比較

<><= および >= の関係演算子は、System.Version が解析するバージョンをサポートするので、4 つの数値部分を持つバージョンを相互に比較できます。 たとえば、'1.2.3.4' < '1.10.0.0'true です。

注意事項

System.Version の比較では、1 つのまたは両方のバージョンで 4 つの部分すべてが指定されていない場合に、驚くべき結果を生成する場合があります。 たとえば、バージョン 1.1 はバージョン 1.1.0 より古くなります。

MSBuild には、セマンティック バージョン (semver) と互換性のある、規則セットが異なる、バージョンを比較するプロパティ関数があります。

関連項目