속성 함수

프로퍼티 함수는 MSBuild 프로퍼티 정의에 나타나는 .NET 메서드에 대한 호출입니다. 작업과 달리 속성 함수는 대상 외부에서 사용할 수 있습니다. 속성 함수는 속성 또는 항목이 확장될 때마다 평가됩니다. 따라서 대상 외부의 속성 및 항목의 경우 대상이 실행되기 전에 속성 함수가 평가됩니다. 대상 내의 속성 그룹 및 항목 그룹의 경우 대상이 평가될 때 속성 함수가 평가됩니다.

MSBuild 작업을 사용하지 않고도 시스템 시간을 읽고 문자열을 비교하며 정규식을 일치시키고 빌드 스크립트의 다른 작업을 수행할 수 있습니다. MSBuild는 문자열을 숫자로, 숫자를 문자열로 변환하려고 하며, 필요한 경우 다른 변환을 수행합니다.

속성 기능에서 반환된 문자열 값에서는 특수 문자가 이스케이프됩니다. 프로젝트 파일에 직접 입력된 것처럼 값을 처리하려면 $([MSBuild]::Unescape())를 사용하여 특수 문자를 이스케이프 해제합니다.

속성 함수 구문

다음과 같은 세 가지 종류의 속성 함수가 있으며, 각 함수의 구문은 서로 다릅니다.

  • 문자열(인스턴스) 속성 함수
  • 정적 속성 함수
  • MSBuild 속성 함수

문자열 속성 함수

모든 빌드 속성 값은 문자열 값입니다. 문자열(인스턴스) 메서드를 사용하여 모든 속성 값에 대해 수행할 수 있습니다. 예를 들어, 다음 코드를 사용하여 전체 경로를 나타내는 빌드 속성에서 드라이브 이름(처음 세 문자)을 추출할 수 있습니다.

$(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>

정적 속성 함수에서는 이러한 시스템 클래스의 모든 공용 정적 메서드나 속성을 사용할 수 있습니다:

또한 다음 정적 메서드 및 속성을 사용할 수 있습니다.

System.OperatingSystem 속성 함수

속성 함수는 System.OperatingSystem MSBuild가 실행 중인 운영 체제에 대한 정보를 반환합니다. 예를 들어 프로젝트가 Linux를 대상으로 하고 macOS에서 빌드하는 경우 속성 함수는 macOS에 대한 정보를 반환합니다.

.NET(dotnet build)에서 실행되는 MSBuild에서는 클래스의 모든 정적 메서드를 System.OperatingSystem 정적 속성 함수로 호출할 수 있습니다.

.NET Framework(MSBuild.exe)에서 실행되는 MSBuild에서는 다음 메서드 System.OperatingSystem 만 정적 속성 함수로 호출할 수 있습니다. MSBuild는 .NET Framework에서 정의하지 않으므로 내부적으로 System.OperatingSystem 구현합니다. .NET SDK(예: System.OperatingSystem::IsTvOS)가 없는 운영 체제에 대한 메서드는 호출할 수 없습니다.

다음 예는 이러한 속성 함수의 사용법을 보여줍니다.

<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))

예를 들어, 숫자 값을 가지는 두 속성을 함께 추가하려면 다음 코드를 사용합니다.

$([MSBuild]::Add($(NumberOne), $(NumberTwo)))

다음은 MSBuild 속성 함수 목록입니다.

함수 시그니처 설명
double Add(double a, double b) 두 double을 더합니다.
long Add(long a, long b) 두 long을 더합니다.
double Subtract(double a, double b) 한 double에서 다른 한 double을 뺍니다.
long Subtract(long a, long b) 한 long에서 다른 한 long을 뺍니다.
double Multiply(double a, double b) 두 double을 곱합니다.
long Multiply(long a, long b) 두 long을 곱합니다.
double Divide(double a, double b) 한 double을 다른 한 double로 나눕니다.
long Divide(long a, long b) 한 long을 다른 한 long으로 나눕니다.
double Modulo(double a, double b) 한 double을 다른 한 double로 나눈 나머지입니다.
long Modulo(long a, long b) 한 long을 다른 한 long으로 나눈 나머지입니다.
string Escape(string unescaped) MSBuild 이스케이프 규칙에 따라 문자열을 이스케이프합니다.
string Unescape(string escaped) MSBuild 이스케이프 규칙에 따라 문자열을 이스케이프하지 않습니다.
int BitwiseOr(int first, int second) first와 second에 대해 비트 OR를 수행합니다(first | second).
int BitwiseAnd(int first, int second) first와 second에 대해 비트 AND를 수행합니다(first & second).
int BitwiseXor(int first, int second) first와 second에 대해 비트 XOR를 수행합니다(first ^ second).
int BitwiseNot(int first) 비트 NOT을 수행합니다(~first).
bool IsOsPlatform(string platformString) 현재 OS 플랫폼이 platformString인지 여부를 지정합니다. platformStringOSPlatform의 멤버여야 합니다.
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) pathbasePath의 상대 경로로 설정합니다. basePath는 절대 디렉터리여야 합니다. 상대 경로로 설정할 수 없는 path는 반환된 축자입니다. Uri.MakeRelativeUri와 비슷합니다.
string ValueOrDefault(string conditionValue, string defaultValue) conditionValue 매개 변수가 비어 있는 경우에만 defaultValue 매개 변수의 문자열을 반환하고, 그렇지 않으면 conditionValue 값을 반환합니다.
string ConvertToBase64(string toEncode) 모든 바이트를 base64로 변환(영숫자 문자 더하기 +/)한 후 하나 또는 두 개의 =로 끝나는 문자열을 반환합니다.
string ConvertFromBase64(string toDecode) base64에서 변환(영숫자 문자 더하기 +/)한 후 하나 또는 두 개의 =로 끝나는 문자열을 반환합니다.

중첩 속성 함수

다음 예제에서 볼 수 있듯이 속성 함수를 결합하여 더 복잡한 함수를 만들 수 있습니다:

$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))

이 예제에서는 다음 경로에 지정된 파일의 FileAttributes.경로 tempFile에 의해 제공된 파일의 Archive 비트(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 속성 함수는 레지스트리 키 값을 반환합니다. 이 함수는 두 개의 인수(키 이름 및 값 이름)를 사용하고 레지스트리의 값을 반환합니다. 값 이름을 지정하지 않은 경우 기본값이 반환됩니다.

다음 예제에서는 이 함수를 사용하는 방법을 보여 줍니다.

$([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

경고

.NET SDK 버전의 MSBuild(dotnet build)에서는 이 함수가 지원되지 않습니다.

MSBuild GetRegistryValueFromView

MSBuild GetRegistryValueFromView 속성 함수는 레지스트리 키, 값 및 순서가 지정된 하나 이상의 레지스트리 보기를 고려하여 시스템 레지스트리 데이터를 가져옵니다. 키 및 값은 발견될 때까지 각 레지스트리 보기에서 순서대로 검색됩니다.

이 속성 함수의 구문은 다음과 같습니다.

[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))

ReferenceAssemblies 키의 SLRuntimeInstallPath 데이터를 가져오고, 먼저 64비트 레지스트리 보기에서 찾은 다음, 32비트 레지스트리 보기에서 찾습니다.

경고

.NET SDK 버전의 MSBuild(dotnet build)에서는 이 함수가 지원되지 않습니다.

MSBuild MakeRelative

MSBuild MakeRelative 속성 함수는 첫 번째 경로를 기준으로 하여 두 번째 경로의 상대 경로를 반환합니다. 각 경로는 파일 또는 폴더일 수 있습니다.

이 속성 함수의 구문은 다음과 같습니다.

$([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에서 이 함수는 두 번째 선택적 인수를 허용해 사용할 해시 알고리즘을 요청합니다.

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1", "Sha256"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

두 번째 인수는 대/소문자를 구분하지 않으며 현재 다음 값을 지원합니다.

  • 레거시 - 두 번째 인수 없이 함수 호출과 동일한 동작을 유지합니다. string.GetHashCode와 비슷한 속성을 가진 부호 있는 32비트 정수 값을 반환합니다.
  • Fnv1a32bit - 지정된 문자열의 Fowler–Noll–Vo hash of version '1a' 해시를 나타내는 부호 있는 32비트 정수 값을 반환합니다.
  • Fnv1a64bit - 지정된 문자열의 Fowler–Noll–Vo hash of version '1a' 해시를 나타내는 부호 있는 64비트 정수 값을 반환합니다.
  • Sha256 - 지정된 문자열의 SHA256 해시를 나타내는 접두사 없는 16진수 문자열을 반환합니다.

MSBuild ValueOrDefault

MSBuild ValueOrDefault 속성 함수는 첫 번째 인수가 null이거나 비어 있지 않은 한 첫 번째 인수를 반환합니다. 첫 번째 인수가 null이거나 비어 있으면 함수는 두 번째 인수를 반환합니다.

다음 예제에서는 이 함수를 사용하는 방법을 보여 줍니다.

<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) 후보 대상 프레임워크(두 번째 인수)가 첫 번째 인수로 표시된 대상 프레임워크와 호환되면 'True'를 반환하고, 그렇지 않으면 false를 반환합니다.

GetTargetFrameworkVersionGetTargetPlatformVersionversionPartCount 매개 변수는 기본값이 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) 아래의 규칙에 따라 버전 a와 버전 b가 동일하면 true를 반환합니다.
VersionGreaterThan(string a, string b) 아래의 규칙에 따라 버전 a가 버전 b보다 크면 true를 반환합니다.
VersionGreaterThanOrEquals(string a, string b) 아래의 규칙에 따라 버전 a가 버전 b보다 크거나 같으면 true를 반환합니다.
VersionLessThan(string a, string b) 아래의 규칙에 따라 버전 a가 버전 b보다 작으면 true를 반환합니다.
VersionLessThanOrEquals(string a, string b) 아래의 규칙에 따라 버전 a가 버전 b보다 작거나 같으면 true를 반환합니다.
VersionNotEquals(string a, string b) 아래의 규칙에 따라 버전 a와 버전 b가 동일하면 false를 반환합니다.

이들 메서드에서 버전은 System.Version과 같이 구문 분석되며 다음과 같은 예외가 적용됩니다.

  • 선행 v 또는 V가 무시됩니다. 따라서 $(TargetFrameworkVersion)과의 비교가 가능합니다.

  • 첫 번째 '-' 또는 '+'부터 버전 문자열의 마지막까지는 모두 무시됩니다. 따라서 유의적 버전(semver)의 전달이 가능합니다. 단, 순서는 semver와 같지 않습니다. 그 대신 시험판 지정자와 빌드 메타데이터가 정렬 가중치를 갖지 않습니다. 이는 일례로 >= x.y에 대해 기능을 설정하고 x.y.z-pre에 적용되도록 하는 데 유용할 수 있습니다.

  • 지정되지 않은 부분은 0 값 부분과 동일합니다. (x == x.0 == x.0.0 == x.0.0.0).

  • 정수 구성 요소에서 공백이 허용되지 않습니다.

  • 주 버전만 유효합니다(33.0.0.0과 같음).

  • 정수 구성 요소에서 +는 양의 부호로 허용되지 않습니다(semver 메타데이터로 취급되어 무시됩니다).

TargetFramework 속성의 비교에서는 일반적으로 버전을 추출하여 비교하는 대신 IsTargetFrameworkCompatible을 사용해야 합니다. 이렇게 하면 TargetFrameworkIdentifier와 버전이 다른 TargetFramework를 비교할 수 있습니다.

MSBuild 조건 함수

ExistsHasTrailingSlash 함수는 속성 함수가 아닙니다. Condition 특성과 함께 사용할 수 있습니다. MSBuild 조건을 참조하세요.