プロパティ関数は、MSBuild プロパティ定義に表示される .NET メソッドの呼び出しです。 通常、これらを使用して、より複雑なロジックを必要とするプロパティ定義を構築します。
タスクとは異なり、プロパティ関数はターゲットの外部で使用できます。 プロパティ関数は、プロパティまたは項目が展開されるたびに評価されます。 そのため、ターゲットの外部にあるプロパティと項目の場合、プロパティ関数はターゲットを実行する前に評価されます。 ターゲット内のプロパティ グループと項目グループの場合、ターゲットの実行時にプロパティ関数が評価されます。
MSBuild タスクを使用しないと、システム時刻の読み取り、文字列の比較、正規表現の照合、ビルド スクリプトでのその他のアクションの実行を行うことができます。 MSBuild は、文字列を数値に変換し、数値を文字列に変換し、必要に応じて他の変換を行います。
プロパティ関数から返される文字列値の特殊文字はエスケープされています。 値をプロジェクト ファイルに直接配置されたかのように扱う場合は、 $([MSBuild]::Unescape())
を使用して特殊文字をエスケープします。
プロパティ関数の構文
これらは 3 種類のプロパティ関数です。各関数には異なる構文があります。
- 文字列 (インスタンス) プロパティ関数
- 静的プロパティ関数
- MSBuild プロパティ関数
文字列プロパティ関数
すべてのビルド プロパティ値は、単なる文字列値です。 文字列 (インスタンス) メソッドを使用して、任意のプロパティ値を操作できます。 たとえば、次のコードを使用して、完全なパスを表すビルド プロパティからドライブ名 (最初の 3 文字) を抽出できます。
$(ProjectOutputFolder.Substring(0,3))
静的プロパティ関数
ビルド スクリプトでは、多くのシステム クラスの静的プロパティとメソッドにアクセスできます。 静的プロパティの値を取得するには、次の構文を使用します。ここで、 Class
はシステム クラスの名前、 Property
はプロパティの名前です。
$([Class]::Property)
たとえば、次のコードを使用して、ビルド プロパティを現在の日時に設定できます。
<Today>$([System.DateTime]::Now)</Today>
静的メソッドを呼び出すには、次の構文を使用します。ここで、 Class
はシステム クラスの名前、 Method
はメソッドの名前、 (Parameters)
はメソッドのパラメーター リストです。
$([Class]::Method(Parameters))
たとえば、ビルド プロパティを新しい GUID に設定するには、次のスクリプトを使用できます。
<NewGuid>$([System.Guid]::NewGuid())</NewGuid>
静的プロパティ関数では、次のシステム クラスに対して .NET Standard 2.0 で定義されている任意のパブリック静的メソッドまたはプロパティを使用できます。
- System.Byte
- System.Char
- System.Convert
- System.DateTime
- System.DateTimeOffset (MSBuild 17.3 以降で利用可能)
- System.Decimal
- System.Double
- System.Enum
- System.Guid
- System.Int16
- System.Int32
- System.Int64
- System.IO.Path
- System.Math
- System.Runtime.InteropServices.OSPlatform
- System.Runtime.InteropServices.RuntimeInformation
- System.UInt16
- System.UInt32
- System.UInt64
- System.SByte
- System.Single
- System.String
- System.StringComparer
- System.TimeSpan
- System.Text.RegularExpressions.Regex
- System.UriBuilder
- System.Version
- Microsoft.Build.Utilities.ToolLocationHelper
注
.NET Standard 2.0 で定義されていないメソッドとプロパティは、それらをサポートする環境で MSBuild を使用する場合に使用できますが、すべての状況で使用できることを保証することはできません。 互換性の理由から、避けるのが最善です。
さらに、次の静的メソッドとプロパティを使用できます。
- System.Environment::CommandLine
- System.Environment::ExpandEnvironmentVariables
- System.Environment::GetEnvironmentVariable
- System.Environment::GetEnvironmentVariables
- System.Environment::GetFolderPath
- System.Environment::GetLogicalDrives
- System.Environment::Is64BitOperatingSystem
- System.Environment::Is64BitProcess
- System.Environment::MachineName
- System.Environment::NewLine
- System.Environment::OSVersion
- System.Environment::P rocessorCount
- System.Environment::StackTrace
- System.Environment::SystemDirectory
- System.Environment::SystemPageSize
- System.Environment::TickCount
- System.Environment::UserDomainName
- System.Environment::UserInteractive
- System.Environment::UserName
- System.Environment::Version
- System.Environment::WorkingSet
- System.IO.Directory::GetDirectories
- System.IO.Directory::GetFiles
- System.IO.Directory::GetLastAccessTime
- System.IO.Directory::GetLastWriteTime
- System.IO.Directory::GetParent
- System.IO.File::Exists
- System.IO.File::GetAttributes
- System.IO.File::GetCreationTime
- System.IO.File::GetLastAccessTime
- System.IO.File::GetLastWriteTime
- System.IO.File::ReadAllText
- System.Globalization.CultureInfo::GetCultureInfo
- System.Globalization.CultureInfo::new
- System.Globalization.CultureInfo::CurrentUICulture
System.OperatingSystem プロパティ関数
System.OperatingSystem
プロパティ関数は、MSBuild が実行されているオペレーティング システムに関する情報を返します。 たとえば、プロジェクトが Linux を対象とし、macOS でビルドした場合、プロパティ関数は macOS に関する情報を返します。
.NET (dotnet build
) で実行されている MSBuild では、 System.OperatingSystem
クラスのすべての静的メソッドは静的プロパティ関数として呼び出されます。
.NET Framework (MSBuild.exe
) で実行されている MSBuild では、次の System.OperatingSystem
メソッドのみが静的プロパティ関数として呼び出されます。 MSBuild では内部的に実装されます。これは、 System.OperatingSystem
が .NET Framework で定義していないためです。
System.OperatingSystem::IsTvOS
など、.NET SDK がないオペレーティング システムのメソッドは呼び出しできません。
- System.OperatingSystem::IsOSPlatform
- System.OperatingSystem::IsOSPlatformVersionAtLeast
- System.OperatingSystem::IsLinux
- System.OperatingSystem::IsFreeBSD
- System.OperatingSystem::IsFreeBSDVersionAtLeast
- System.OperatingSystem::IsMacOS
- System.OperatingSystem::IsMacOSVersionAtLeast
- System.OperatingSystem::IsWindows
- System.OperatingSystem::IsWindowsVersionAtLeast
次の例は、これらのプロパティ関数の使用方法を示しています。
<IsWindows>$([System.OperatingSystem]::IsWindows())</IsWindows>
静的プロパティに対するインスタンス メソッドの呼び出し
オブジェクト インスタンスを返す静的プロパティにアクセスする場合は、そのオブジェクトのインスタンス メソッドを呼び出すことができます。 インスタンス メソッドを呼び出すには、次の構文を使用します。ここで、 Class
はシステム クラスの名前、 Property
はプロパティの名前、 Method
はメソッドの名前、 (Parameters)
はメソッドのパラメーター リストです。
$([Class]::Property.Method(Parameters))
クラスの名前は、名前空間で完全修飾されている必要があります。
たとえば、次のコードを使用して、ビルド プロパティを現在の日付に設定できます。
<Today>$([System.DateTime]::Now.ToString('yyyy.MM.dd'))</Today>
MSBuild プロパティ関数
ビルド内のいくつかの静的メソッドにアクセスして、算術、ビットごとの論理、エスケープ文字のサポートを提供できます。 これらのメソッドには、次の構文を使用してアクセスします。ここで、 Method
はメソッドの名前、 (Parameters)
はメソッドのパラメーター リストです。
$([MSBuild]::Method(Parameters))
たとえば、数値を持つ 2 つのプロパティをまとめて追加するには、次のコードを使用します。
$([MSBuild]::Add($(NumberOne), $(NumberTwo)))
MSBuild プロパティ関数の一覧を次に示します。
関数シグネチャ | 説明 |
---|---|
double Add(double a, double b) |
2 つの double を追加します。 |
long Add(long a, long b) |
2 つの long を追加します。 |
double Subtract(double a, double b) |
2 つの倍精度浮動小数点型 (double) を減算します。 |
long Subtract(long a, long b) |
2 つの long を減算します。 |
double Multiply(double a, double b) |
二つの倍精度浮動小数点型 double を乗算します。 |
long Multiply(long a, long b) |
2 つの long を乗算します。 |
double Divide(double a, double b) |
2 つの倍精度浮動小数点型 (double) を除算します。 |
long Divide(long a, long b) |
2 つの long を除算します。 |
double Modulo(double a, double b) |
剰余 2 倍。 |
long Modulo(long a, long b) |
2つの長整数の剰余。 |
string Escape(string unescaped) |
MSBuild エスケープ規則に従って文字列をエスケープします。 |
string Unescape(string escaped) |
MSBuild エスケープ規則に従って文字列のエスケープを解除します。 |
int BitwiseOr(int first, int second) |
1 番目と 2 番目 (最初の | 秒) にビットごとの OR を実行します。 |
int BitwiseAnd(int first, int second) |
1 番目と 2 番目 (1 番目と 2 番目) にビットごとの AND を実行します。 |
int BitwiseXor(int first, int second) |
1 番目と 2 番目の (最初 ^ 2 番目) にビット単位の XOR を実行します。 |
int BitwiseNot(int first) |
ビットごとの NOT (~first) を実行します。 |
bool IsOsPlatform(string platformString) |
現在の OS プラットフォームが platformString されているかどうかを指定します。
platformString は、 OSPlatformのメンバーである必要があります。 |
bool IsOSUnixLike() |
現在の OS が Unix システムの場合は True。 |
string NormalizePath(params string[] path) |
指定されたパスの正規化された完全パスを取得し、現在のオペレーティング システムの正しいディレクトリ区切り文字が含まれていることを確認します。 |
string NormalizeDirectory(params string[] path) |
指定されたディレクトリの正規化された完全パスを取得し、現在のオペレーティング システムの正しいディレクトリ区切り文字が含まれていることを確認します。また、末尾にスラッシュがあることを確認します。 |
string EnsureTrailingSlash(string path) |
指定されたパスに末尾のスラッシュがない場合は、追加します。 パスが空の文字列の場合は、変更しません。 |
string GetPathOfFileAbove(string file, string startingDirectory) |
現在のビルド ファイルの場所以上にあるディレクトリ構造内のファイルの完全パスを検索して返します。指定されている場合は、 startingDirectory に基づいて返します。 |
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) |
指定されたディレクトリ内のファイルのディレクトリ、またはそのディレクトリの上のディレクトリ構造内の場所を見つけて返します。 |
string MakeRelative(string basePath, string path) |
path を基準にしてbasePath を作成します。
basePath は絶対ディレクトリである必要があります。
path を相対にできない場合は、逐語的に返されます。
Uri.MakeRelativeUri に似ています。 |
string ValueOrDefault(string conditionValue, string defaultValue) |
パラメーター defaultValue が空の場合にのみ、パラメーター conditionValue 内の文字列を返します。それ以外の場合は、conditionValue 値を返します。 |
string ConvertToBase64(string toEncode) |
1 つまたは 2 つの+ で終わる、すべてのバイトを base 64 (英数字と/ と= ) に変換した後の文字列を返します。 |
string ConvertFromBase64(string toDecode) |
base 64(英数字と+ 及び/ からなる)から変換され、1つまたは2つの= で終わる文字列を返します。 |
入れ子になったプロパティ関数
次の例に示すように、プロパティ関数を組み合わせて、より複雑な関数を形成できます。
$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))
次の使用例は、 FileAttributesの値を返します。
Archive
パス tempFile
によって指定されたファイルのビット (32 または 0)。 列挙されたデータ値は、一部のコンテキストでは名前で表示できないことに注意してください。 前の例では、数値 (32) を代わりに使用する必要があります。 それ以外の場合は、呼び出されるメソッドの期待に応じて、列挙型データ値を使用する必要があります。 次の例では、列挙値が RegexOptions。
ECMAScript
は、このメソッドが想定するように数値を変換できないため、使用する必要があります。
<PropertyGroup>
<GitVersionHeightWithOffset>$([System.Text.RegularExpressions.Regex]::Replace("$(PrereleaseVersion)", "^.*?(\d+)$", "$1", "System.Text.RegularExpressions.RegexOptions.ECMAScript"))</GitVersionHeightWithOffset>
</PropertyGroup>
メタデータは、入れ子になったプロパティ関数にも含まれる場合があります。 詳細については、「バッチ処理 を参照してください。
MSBuild DoesTaskHostExist
MSBuild の DoesTaskHostExist
プロパティ関数は、指定されたランタイム値とアーキテクチャ値に対してタスク ホストが現在インストールされているかどうかを返します。
このプロパティ関数には、次の構文があります。
$([MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture))
MSBuild EnsureTrailingSlash
MSBuild の EnsureTrailingSlash
プロパティ関数では、末尾にスラッシュがまだ存在しない場合に追加されます。
このプロパティ関数には、次の構文があります。
$([MSBuild]::EnsureTrailingSlash('$(PathProperty)'))
MSBuild GetDirectoryNameOfFileAbove
MSBuild GetDirectoryNameOfFileAbove
プロパティ関数は、指定したディレクトリから始まる、指定したファイルを含むディレクトリを上方向に検索します。 見つかった場合は、ファイルを含む最も近いディレクトリの完全なパスを返します。それ以外の場合は空の文字列を返します。
このプロパティ関数には、次の構文があります。
$([MSBuild]::GetDirectoryNameOfFileAbove(string startingDirectory, string fileName))
次の例は、一致するものが見つかった場合にのみ、現在のフォルダー内または現在のフォルダーの上に最も近い EnlistmentInfo.props ファイルをインポートする方法を示しています。
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />
この例は、代わりに GetPathOfFileAbove
関数を使用して、より簡潔に記述できることに注意してください。
<Import Project="$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))' != '' " />
MSBuild GetPathOfFileAbove
MSBuild GetPathOfFileAbove
プロパティ関数は、指定したディレクトリから始まる、指定したファイルを含むディレクトリを上方向に検索します。 見つかった場合は、最も近い一致するファイルの完全なパスを返します。それ以外の場合は空の文字列を返します。
このプロパティ関数には、次の構文があります。
$([MSBuild]::GetPathOfFileAbove(string file, [string startingDirectory]))
ここで file
は検索するファイルの名前で、 startingDirectory
は検索を開始するオプションのディレクトリです。 既定では、現在のファイルの独自のディレクトリで検索が開始されます。
この例では、 dir.props という名前のファイルを現在のディレクトリ内または現在のディレクトリの上にインポートする方法を示します。一致するものが見つかった場合に限ります。
<Import Project="$([MSBuild]::GetPathOfFileAbove(dir.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(dir.props))' != '' " />
機能的に同等である。
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))' != '' " />
ただし、現在のファイルと一致しないように、親ディレクトリで検索を開始する必要がある場合があります。 この例では、Directory.Build.props ファイルを再帰的にインポートすることなく、階層がより高いレベルにある最も近い Directory.Build.props ファイルをインポートする方法を示します。
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
機能的に同等である。
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildThisFileDirectory)../', 'Directory.Build.props'))/Directory.Build.props" />
MSBuild GetRegistryValue
MSBuild GetRegistryValue
プロパティ関数は、レジストリ キーの値を返します。 この関数は、キー名と値名の 2 つの引数を受け取り、レジストリから値を返します。 値名を指定しない場合は、既定値が返されます。
次の例は、この関数の使用方法を示しています。
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, ``)) // default value
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, `SymbolCacheDir`))
$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\SOFTWARE\(SampleName)`, `(SampleValue)`)) // parens in name and value
Warnung
.NET SDK バージョンの MSBuild (dotnet build
) では、この関数はサポートされていません。
MSBuild GetRegistryValueFromView
MSBuild GetRegistryValueFromView
プロパティ関数は、レジストリ キー、値、および 1 つ以上の順序付けられたレジストリ ビューを指定して、システム レジストリ データを取得します。 キーと値は、見つかるまで各レジストリ ビューで順番に検索されます。
このプロパティ関数の構文は次のとおりです。
[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)
Windows 64 ビット オペレーティング システムは、32 ビット アプリケーション のHKEY_LOCAL_MACHINE\SOFTWARE レジストリ ビューを表示する HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node レジストリ キーを保持します。
既定では、WOW64 で実行されている 32 ビット アプリケーションは 32 ビット レジストリ ビューにアクセスし、64 ビット アプリケーションは 64 ビット レジストリ ビューにアクセスします。
次のレジストリ ビューを使用できます。
レジストリ ビュー | 定義 |
---|---|
RegistryView.Registry32 | 32 ビット アプリケーション レジストリ ビュー。 |
RegistryView.Registry64 | 64 ビット アプリケーション レジストリ ビュー。 |
RegistryView.Default | アプリケーションが実行されているプロセスに一致するレジストリ ビュー。 |
次に例を示します。
$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Silverlight\v3.0\ReferenceAssemblies', 'SLRuntimeInstallPath', null, RegistryView.Registry64, RegistryView.Registry32))
はじめに 64 ビット レジストリ ビュー、その後 32 ビット レジストリ ビューでReferenceAssembliesキーのSLRuntimeInstallPathデータを取得します。
Warnung
.NET SDK バージョンの MSBuild (dotnet build
) では、この関数はサポートされていません。
MSBuild MakeRelative
MSBuild MakeRelative
プロパティ関数は、最初のパスに対する 2 番目のパスの相対パスを返します。 各パスには、ファイルまたはフォルダーを指定できます。
このプロパティ関数には、次の構文があります。
$([MSBuild]::MakeRelative($(FileOrFolderPath1), $(FileOrFolderPath2)))
次のコードは、この構文の例です。
<PropertyGroup>
<Path1>c:\users\</Path1>
<Path2>c:\users\username\</Path2>
</PropertyGroup>
<Target Name = "Go">
<Message Text ="$([MSBuild]::MakeRelative($(Path1), $(Path2)))" />
<Message Text ="$([MSBuild]::MakeRelative($(Path2), $(Path1)))" />
</Target>
<!--
Output:
username\
..\
-->
MSBuild StableStringHash
MSBuild StableStringHash
プロパティ関数は、文字列引数を受け取り、安定することが保証されているハッシュ コードを返します。つまり、同じ文字列入力に対して常に同じコードが返されます。 返されるハッシュは、MSBuild または dotnet build
が使用されているかどうかに関係なく同じであり、.NET メソッド GetHashCode
とは異なり、プラットフォーム アーキテクチャ全体で安定しています。 異なる MSBuild バージョン間で安定している保証はありません。
この関数は、MSBuild 16.9.0 以降で使用できます。
次の例は、この関数の使用方法を示しています。
<Project>
<PropertyGroup>
<MyHash>$([MSBuild]::StableStringHash("test1"))</MyHash>
</PropertyGroup>
<Target Name="WriteHash" AfterTargets="Build">
<Message Text="Hash: $(MyHash)"/>
</Target>
</Project>
MSBuild バージョン 17.10.0 から、この関数は、使用するハッシュ アルゴリズムを要求する 2 番目の省略可能な引数を受け入れます。
<Project>
<PropertyGroup>
<MyHash>$([MSBuild]::StableStringHash("test1", "Sha256"))</MyHash>
</PropertyGroup>
<Target Name="WriteHash" AfterTargets="Build">
<Message Text="Hash: $(MyHash)"/>
</Target>
</Project>
2 番目の引数では大文字と小文字が区別されず、現在、次の値がサポートされています。
- レガシ - 2 番目の引数を指定せずに関数を呼び出す場合と同じ動作を保持します。
string.GetHashCode
と同様のプロパティを持つ符号付き 32 ビット整数を返します。 - Fnv1a32bit - 指定された文字列の バージョン '1a' ハッシュの Fowler-Noll-Vo ハッシュ を表す符号付き 32 ビット整数を返します。
- Fnv1a64bit - 指定された文字列の バージョン '1a' ハッシュの Fowler-Noll-Vo ハッシュ を表す符号付き 64 ビット整数を返します。
- Sha256 - 指定された文字列の SHA256 ハッシュを表す未修正の 16 進文字列を返します。
MSBuild ValueOrDefault (デフォルト値)
MSBuild ValueOrDefault
プロパティ関数は、null または空でない限り、最初の引数を返します。 最初の引数が null または空の場合、関数は 2 番目の引数を返します。
次の例は、この関数の使用方法を示しています。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Value1>$([MSBuild]::ValueOrDefault('$(UndefinedValue)', 'a'))</Value1>
<Value2>$([MSBuild]::ValueOrDefault('b', '$(Value1)'))</Value2>
</PropertyGroup>
<Target Name="MyTarget">
<Message Text="Value1 = $(Value1)" />
<Message Text="Value2 = $(Value2)" />
</Target>
</Project>
<!--
Output:
Value1 = a
Value2 = b
-->
MSBuild TargetFramework 関数と TargetPlatform 関数
MSBuild 16.7 以降では、 TargetFramework プロパティと TargetPlatform プロパティを処理するための複数の関数が定義されています。
関数シグネチャ | 説明 |
---|---|
GetTargetFrameworkIdentifier(string targetFramework) |
TargetFramework から TargetFrameworkIdentifier を解析します。 |
GetTargetFrameworkVersion(string targetFramework, int versionPartCount) |
TargetFramework から TargetFrameworkVersion を解析します。 |
GetTargetPlatformIdentifier(string targetFramework) |
TargetFramework から TargetPlatformIdentifier を解析します。 |
GetTargetPlatformVersion(string targetFramework, int versionPartCount) |
TargetFramework から TargetPlatformVersion を解析します。 |
IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) |
候補のターゲット フレームワーク (2 番目の引数) が最初の引数で示されるターゲット フレームワークと互換性がある場合は 'True' を返し、それ以外の場合は false を返します。 |
versionPartCount
とGetTargetFrameworkVersion
のGetTargetPlatformVersion
パラメーターの既定値は 2 です。
次の例は、これらの関数の使用方法を示しています。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Value1>$([MSBuild]::GetTargetFrameworkIdentifier('net5.0-windows7.0'))</Value1>
<Value2>$([MSBuild]::GetTargetFrameworkVersion('net5.0-windows7.0'))</Value2>
<Value3>$([MSBuild]::GetTargetPlatformIdentifier('net5.0-windows7.0'))</Value3>
<Value4>$([MSBuild]::GetTargetPlatformVersion('net5.0-windows7.0'))</Value4>
<Value5>$([MSBuild]::IsTargetFrameworkCompatible('net5.0-windows', 'net5.0'))</Value5>
<Value6>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net6.0'))</Value6>
<Value7>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net8.0'))</Value7>
</PropertyGroup>
<Target Name="MyTarget">
<Message Text="Value1 = $(Value1)" />
<Message Text="Value2 = $(Value2)" />
<Message Text="Value3 = $(Value3)" />
<Message Text="Value4 = $(Value4)" />
<Message Text="Value5 = $(Value5)" />
<Message Text="Value6 = $(Value6)" />
<Message Text="Value7 = $(Value7)" />
</Target>
</Project>
Value1 = .NETCoreApp
Value2 = 5.0
Value3 = windows
Value4 = 7.0
Value5 = True
Value6 = False
Value7 = False
MSBuild バージョン比較関数
MSBuild 16.5 以降では、バージョンを表す文字列を比較するための複数の関数が定義されています。
注
条件の比較演算子 は、 System.Version
オブジェクトとして解析できる文字列を比較できますが、比較によって予期しない結果が発生する可能性があります。 プロパティ関数を優先します。
関数シグネチャ | 説明 |
---|---|
VersionEquals(string a, string b) |
バージョンtrue とa が次の規則に従って等しい場合は、b を返します。 |
VersionGreaterThan(string a, string b) |
バージョン true が次の規則に従ってa より大きい場合は、b を返します。 |
VersionGreaterThanOrEquals(string a, string b) |
バージョン true が次の規則に従ってa 以上の場合は、b を返します。 |
VersionLessThan(string a, string b) |
バージョン true が次の規則に従ってa 未満の場合は、b を返します。 |
VersionLessThanOrEquals(string a, string b) |
バージョン true が次の規則に従ってa 以下の場合は、b を返します。 |
VersionNotEquals(string a, string b) |
バージョンfalse とa が次の規則に従って等しい場合は、b を返します。 |
これらのメソッドでは、バージョンは System.Version のように解析されます。ただし、次の例外があります。
先頭
v
またはV
は無視され、$(TargetFrameworkVersion)
との比較が可能になります。最初の '-' または '+' からバージョン文字列の末尾まではすべて無視されます。 これにより、セマンティック バージョン (semver) を渡すことができますが、順序は semver と同じではありません。 代わりに、プレリリース指定子とビルド メタデータには並べ替えの重みはありません。 これは、たとえば、
>= x.y
の機能を有効にして、x.y.z-pre
を開始する場合などに便利です。指定されていない部分は、0 個の値の部分と同じです。 (
x == x.0 == x.0.0 == x.0.0.0
)。空白は整数コンポーネントでは使用できません。
メジャー バージョンのみが有効です (
3
は3.0.0.0
と等しい)+
は、整数コンポーネントの正符号として許可されていません (semver メタデータとして扱われ、無視されます)
ヒント
TargetFramework プロパティの比較では、通常、バージョンを抽出して比較するのではなく、IsTargetFrameworkCompatible を使用する必要があります。 これにより、TargetFramework
とバージョンが異なるTargetFrameworkIdentifier
を比較できます。
MSBuild 条件関数
Exists
関数とHasTrailingSlash
関数はプロパティ関数ではありません。
Condition
属性で使用できます。
MSBuild の条件を参照してください。