次の方法で共有


MSBuild の条件

MSBuild では、Condition 属性が許可されている場所であればどこでも適用できる特定の条件セットがサポートされています。サポートされている要素 を参照してください。 次の表では、これらの条件について説明します。

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

例えば:

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

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

例えば:

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

単純な英数字文字列やブール値には、単一引用符は必要ありません。 ただし、空の値には単一引用符が必要です。 このチェックでは大文字と小文字が区別されません。
<、>、<=、>= オペランドの数値を評価します。 リレーショナル評価が true の場合は true を返します。 オペランドは、10 進数または 16 進数、または 4 部構成の点線のバージョンに評価される必要があります。 16 進数は 0xで始まる必要があります。 注: 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 プロジェクト/項目テンプレート パラメーター のロジック を参照してください。

Condition 要素は 1 つの文字列であるため、プロパティ値を含め、式で使用されるすべての文字列を一重引用符で囲む必要があります。 演算子間のスペースは許可され、読みやすくするために一般的に使用されますが、必須ではありません。

ブール And 演算子と Or 演算子を使用するには、次の例のように、Condition 要素の文字列値内にオペランドを指定します。

Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"

ブール演算子を連結できます。 演算子 AndOrよりも優先順位が高くなりますが、わかりやすくするために、複数のブール演算子を使用して評価順序を明示的にする場合は、かっこを使用することをお勧めします。 そうしないと、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
  • いつ

関連項目