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 進数は、0x で始まる必要があります。 注: 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 プロジェクト/項目テンプレート パラメーター ロジック) を参照してください。 |
Condition
要素は 1 つの文字列であるため、プロパティ値を含め、式で使用されるすべての文字列を一重引用符で囲む必要があります。 演算子間のスペースは許可され、読みやすくするために一般的に使用されますが、必須ではありません。
ブール And
演算子と Or
演算子を使用するには、次の例のように、 Condition
要素の文字列値内にオペランドを指定します。
Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"
ブール演算子を連結できます。 演算子 And
は Or
よりも優先順位が高くなりますが、わかりやすくするために、複数のブール演算子を使用して評価順序を明示的にする場合は、かっこを使用することをお勧めします。 そうしないと、MSBuild から警告 MSB4130 が返されます。
次の例に示すように、文字列メソッドを条件で使用できます。ここでは、文字列の関連部分のみを比較するために 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) と互換性のある、規則セットが異なる、バージョンを比較するプロパティ関数があります。
条件内の展開
プロジェクト ファイル内の位置に応じて、プロパティ ($)、項目リスト (@)、項目メタデータ (%) の展開を使用できます。 展開は、MSBuild によるプロジェクト ファイルの処理方法に依存します。
Properties
$(SomeProperty)
などの式を含む条件は、評価され、プロパティ値に変換されます。 条件がターゲットから外れる場合、その式はプロジェクト ファイルの評価中に評価されます。 プロパティの値は、すべてのインポートを展開した後のプロジェクト ファイル内の位置によって異なります。 条件がターゲット内にある場合は、ターゲットの実行時に評価され、その値はビルドの実行中に発生した変更の影響を受けます。
条件式が発生する展開されたプロジェクト ファイル内のその時点で定義されていないプロパティは、空の文字列として評価され、診断エラーや警告は出力されません。
項目リスト
@(SomeItems)
などの @ 式を含む条件は、最上位レベルの項目グループとターゲット内で展開されます。
項目は任意のプロパティに依存することができ、また既にシーケンスで定義されている項目にも依存できます。
その理由は、MSBuild によってプロジェクト ファイルが複数のパスで処理されるためです。 項目の評価パスは、最初のプロパティ評価とインポートの展開パスの後に行われます。 したがって、@ 式は、項目の定義が開始された後に評価される任意の条件で使用できます。 つまり、項目、項目グループ、ターゲット内です。
Metadata
%(ItemMetadata)
などのメタデータ式を含む条件は、項目リストと同じコンテキスト、つまり、最上位レベルの項目グループとターゲット内で展開されます。 ただし、項目グループがターゲットの外部にあるか、ターゲットの内部にあるかに応じて、項目グループ内での展開の動作が異なる場合があります。 また、さまざまな形式のメタデータ式 (%(ItemName.MetadataName)
、%(JustTheMetadataName)
、@(ItemName->'%(MetadataName)')
) のうち、ターゲットの外部で使用できるのは項目変換 (最後の形式) のみです。 ターゲット内の % 式の値は実行時に評価され、ターゲット実行中の状態の変化に依存します。 ターゲットの実行とその中に含まれる %式の値も、ターゲットのバッチ処理に依存し、バッチ処理をトリガーすることもあります。「MSBuild バッチ」を参照してください。
サポートされる要素
次の要素は、Condition
属性をサポートしています。
- インポート
- ImportGroup
- 項目
- ItemDefinitionGroup
- ItemGroup
- ItemMetadata
- OnError
- 出力
- プロパティ
- PropertyGroup
- Target
- タスク
- UsingTask
- いつ