MSBuild の条件
MSBuild では、Condition
属性が許可されている場所であればどこでも適用できる特定の条件セットがサポートされています。サポートされている要素 を参照してください。 次の表では、これらの条件について説明します。
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 がプロジェクト ファイル を処理する方法によって異なります。
プロパティ
$(SomeProperty)
などの式を含む条件が評価され、プロパティ値に変換されます。 条件がターゲットの外部にある場合、式はプロジェクト ファイルの評価中に評価されます。 プロパティの値は、すべてのインポートを展開した後のプロジェクト ファイル内の位置によって異なります。 条件がターゲット内にある場合は、ターゲットの実行時に評価され、値はビルドの実行中に発生するすべての変更の影響を受けます。
展開されたプロジェクト ファイル内で条件式が発生した時点で定義されていないプロパティは、診断エラーや警告なしで空の文字列に評価されます。
項目リスト
@(SomeItems)
などの @-expression を含む条件は、最上位レベルの項目グループとターゲットで展開されます。
項目は任意のプロパティに依存でき、シーケンスで既に定義されている項目に依存できます。
その理由は、MSBuild がプロジェクト ファイルを複数のパスで処理するためです。 項目評価パスは、最初のプロパティ評価とインポート拡張パスの後に行われます。 したがって、@式は、項目の定義が開始された後に評価されるすべての条件で許可されます。 つまり、項目、項目グループ、およびターゲット内です。
メタデータ
%(ItemMetadata)
などのメタデータ式を含む条件は、アイテム リストと同じコンテキスト、つまり、最上位レベルの項目グループとターゲット内で展開されます。 ただし、項目グループがターゲットの外部にあるか、ターゲットの内部にあるかに応じて、項目グループ内で動作が異なる場合があります。 また、さまざまな形式のメタデータ式、%(ItemName.MetadataName)
、%(JustTheMetadataName)
、および @(ItemName->'%(MetadataName)')
の場合、ターゲットの外部では項目変換 (最後の変換) のみが許可されます。 ターゲット内の %-expression の値は実行時に評価され、ターゲットの実行中の状態の変化に依存します。 ターゲットの実行と、その中に含まれる %式の値もターゲットのバッチ処理に依存し、バッチ処理をトリガーすることもできます。MSBuild のバッチ処理 を参照してください。
サポートされる要素
次の要素は、Condition
属性をサポートしています。
- 輸入
- ImportGroup
- アイテム
- ItemDefinitionGroup
- ItemGroup
- ItemMetadata
- OnError
- アウトプット
- 財産
- PropertyGroup
- ターゲット
- タスク
- UsingTask
- いつ
関連項目
- MSBuild リファレンス の
- 条件付きコンストラクト の
- チュートリアル: MSBuild プロジェクト ファイルをゼロから作成する