MSBuild の条件
MSBuild では、Condition
属性が許可されている場所ならどこでも適用できる、特定の条件のセットがサポートされています。 次の表は、その条件を説明したものです。
条件 | 説明 |
---|---|
'stringA ' == 'stringB ' |
stringA が stringB に等しい場合、true と評価されます。次に例を示します。 Condition="'$(Configuration)'=='DEBUG'" 単純な英数字文字列またはブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。 この確認では、大文字と小文字が区別されません。 |
'stringA ' != 'stringB ' |
stringA が stringB と等しくない場合、true と評価されます。次に例を示します。 Condition="'$(Configuration)'!='DEBUG'" 単純な英数字文字列またはブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。 この確認では、大文字と小文字が区別されません。 |
<, >, <=, >= | オペランドの数値を評価します。 関係の評価が true の場合、true を返します。 オペランドは、10 進数または 16 進数、またはドット付きの 4 つの部分のバージョンに評価される必要があります。 16 進数は、"0 x" で始まる必要があります。 注: XML では、文字 < および > をエスケープする必要があります。 シンボル < は、< として表されます。 シンボル > は、> として表されます。 |
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) と互換性のある、規則セットが異なる、バージョンを比較するプロパティ関数があります。