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 프로젝트/항목 템플릿 매개 변수 논리를 참조하세요.

요소는 Condition 단일 문자열이므로 속성 값을 포함하여 식에 사용되는 모든 문자열을 작은따옴표로 묶어야 합니다. 연산자 사이의 공백은 허용되며 일반적으로 가독성을 위해 사용되지만 필수는 아닙니다.

부울 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 프로젝트 파일에는 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

참고 항목