MSBuild 조건

MSBuild는 특성이 허용되는 모든 위치에 적용할 수 있는 특정 조건 집합을 Condition 지원합니다. 지원되는 요소를 참조하세요. 다음 표에서는 이러한 조건에 대해 설명합니다.

조건 Description
'stringA' == 'stringB' stringAstringB와 같으면 true로 평가됩니다.

예시:

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

간단한 영숫자 문자열 또는 부울 값에는 작은따옴표가 필요하지 않습니다. 그러나 빈 값에는 작은따옴표가 필요합니다. 이 검사는 대/소문자를 구분하지 않습니다.
'stringA' != 'stringB' true 같지 않은지 stringA 평가합니다 stringB.

예시:

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 피연산자 중 하나 이상이 true로 평가되면 true로 평가됩니다.
() 내부에 포함된 식이 true로 평가되면 true로 평가되는 그룹화 메커니즘입니다.
$if$ ( %expression% ), $else$, $endif$ 지정한 %expression%이 전달된 사용자 지정 템플릿 매개 변수의 문자열 값과 일치하는지를 확인합니다. $if$ 조건이 true로 평가되면 해당 문이 실행되고 그렇지 않으면 $else$ 조건이 확인됩니다. $else$ 조건이 true이면 해당 문이 실행되고 그렇지 않으면 $endif$ 조건이 식 평가를 종료합니다.

사용법의 예제는 Visual Studio 프로젝트/항목 템플릿 매개 변수 논리를 참조하세요.

연산 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 프로젝트 파일에는 true 부울 형식이 없습니다. 부울 데이터는 비어 있거나 임의의 값으로 설정할 수 있는 속성으로 표시됩니다. 따라서 '$(Prop)' == 'true'는 "Prop이 true인 경우"를 의미하지만 '$(Prop)' != 'false'는 "Prop이 true 또는 설정되지 않았거나 다른 항목으로 설정된 경우"를 의미합니다.

부울 논리는 조건 컨텍스트에서만 평가되므로 <Prop2>'$(Prop1)' == 'true'</Prop>와 같은 속성 설정은 부울 값으로 평가되지 않고 변수 확장 후 문자열로 표시됩니다.

MSBuild는 부울 값으로 사용되는 문자열 속성을 보다 쉽게 사용할 수 있도록 몇 가지 특수 처리 규칙을 구현합니다. 부울 리터럴은 허용되므로 Condition="true"Condition="false"는 예상대로 작동합니다. MSBuild에는 부울 부정 연산자를 지원하는 특수 규칙도 포함됩니다. 따라서 'true'이면 $(Prop) 예상대로 확장 !true 되고 이 값이 같false음과 비교 !$(Prop) 됩니다.

버전 비교

관계 연산자 <, >, <=, >=System.Version으로 구문 분석된 버전을 지원하므로 4개의 숫자 파트로 이루어진 버전을 서로 비교할 수 있습니다. 예를 들어 . '1.2.3.4' < '1.10.0.0'true

주의

System.Version 비교는 버전 하나 또는 둘 다에 4개 파트가 모두 지정되지 않은 경우 예기치 않은 결과를 생성할 수 있습니다. 예를 들어, 버전 1.1이 버전 1.1.0보다 오래된 버전으로 나타날 수 있습니다.

MSBuild는 유의적 버전(semver)과 호환되는 다른 규칙을 갖는 버전 비교 속성 함수를 제공합니다.

조건의 확장

프로젝트 파일의 위치에 따라 속성($), 항목 목록(@) 및 항목 메타데이터(%)에 확장을 사용할 수 있습니다. 확장은 MSBuild가 프로젝트 파일을 처리하는 방법에 따라 달라집니다.

속성

$(SomeProperty) 같은 식이 포함된 조건은 계산되어 속성 값으로 변환됩니다. 조건이 대상 외부에 있으면 프로젝트 파일을 평가하는 동안 식이 계산됩니다. 속성 값은 모든 가져오기를 확장한 후 프로젝트 파일의 위치에 따라 달라집니다. 조건이 대상 내부에 있으면 대상이 실행될 때 계산되고 값은 빌드 실행 중에 발생하는 변경 내용의 영향을 받습니다.

조건 식이 발생하는 확장된 프로젝트 파일의 지점에서 정의되지 않은 속성은 진단 오류 또는 경고 없이 빈 문자열로 평가됩니다.

항목 목록

@(SomeItems) 같은 @-expression이 포함된 조건은 최상위 수준 및 대상의 항목 그룹에서 확장됩니다.

항목은 모든 속성에 따라 달라질 수 있으며 시퀀스에 이미 정의된 항목에 따라 달라질 수 있습니다.

그 이유는 MSBuild가 프로젝트 파일을 여러 패스로 처리하기 때문입니다. 항목 평가 패스는 초기 속성 평가 및 가져오기 확장 패스 후에 발생합니다. 따라서 항목이 정의된 후 평가되는 모든 조건에서 @-expression이 허용됩니다. 즉, 항목, 항목 그룹 및 대상에서 허용됩니다.

메타데이터

%(ItemMetadata) 같은 메타데이터 식을 포함하는 조건은 항목 목록과 동일한 컨텍스트, 즉 최상위 수준 및 대상의 항목 그룹에서 확장됩니다. 그러나 확장은 항목 그룹이 대상 외부 또는 대상 내부에 있는지에 따라 항목 그룹에서 다른 동작을 가질 수 있습니다. 또한 다양한 형식의 메타데이터 식 %(ItemName.MetadataName), %(JustTheMetadataName)@(ItemName->'%(MetadataName)') 중에서 항목 변환(마지막 식)만 대상 외부에서 허용됩니다. 대상의 %-expression 값은 런타임에 계산되며 대상 실행 중 상태 변경 내용에 따라 달라집니다. 대상의 실행과 대상에 포함된 모든 %-expression 값도 대상의 일괄 처리에 따라 달라지고 일괄 처리를 트리거할 수도 있습니다. MSBuild 일괄 처리를 참조하세요.

지원되는 요소

다음 요소는 특성을 지원 Condition 합니다.

  • 가져오기
  • ImportGroup
  • Item
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • 출력
  • 속성
  • PropertyGroup
  • 대상
  • 작업
  • UsingTask
  • When

참고 항목