다음을 통해 공유


MSBuild 조건

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

조건 묘사
'stringA' == 'stringB' stringA stringB같으면 true 계산됩니다.

예를 들어:

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

간단한 영숫자 문자열 또는 부울 값에는 작은따옴표가 필요하지 않습니다. 그러나 빈 값에는 작은따옴표가 필요합니다. 이 검사는 대/소문자를 구분하지 않습니다.
'stringA' != 'stringB' stringA stringB같지 않으면 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 피연산자 중 하나 이상이 true평가되면 true 계산됩니다.
() 내부에 포함된 식이 true평가되는 경우 true 계산되는 그룹화 메커니즘입니다.
$if$ ( %expression% ), $else$, $endif$ 지정된 %expression% 전달된 사용자 지정 템플릿 매개 변수의 문자열 값과 일치하는지 여부를 확인합니다. $if$ 조건이 true평가되면 해당 문이 실행됩니다. 그렇지 않으면 $else$ 조건이 선택됩니다. $else$ 조건이 true경우 해당 문이 실행됩니다. 그렇지 않으면 $endif$ 조건이 식 평가를 종료합니다.

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

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

부울 AndOr 연산자를 사용하려면 다음 예제와 같이 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.1은 버전 1.1.0보다 오래되었습니다.

MSBuild는 의미 체계 버전 관리(semver)와 호환되는 다른 규칙 집합이 있는 버전 비교하는 속성 함수를 제공합니다.

조건의 확장

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

속성

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

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

항목 목록

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

항목은 모든 속성에 따라 달라질 수 있으며, 이미 순서대로 정의된 항목에 따라 달라질 수 있습니다.

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

메타데이터

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

지원되는 요소

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

  • 수입
  • ImportGroup
  • 항목
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • 출력
  • 재산
  • PropertyGroup
  • 과녁
  • 과업
  • UsingTask
  • 언제

참고 항목