MSBuild 조건
MSBuild는 특성이 허용되는 모든 위치에 적용할 수 있는 특정 조건 집합을 Condition
지원합니다. 지원되는 요소를 참조하세요. 다음 표에서는 이러한 조건에 대해 설명합니다.
조건 | Description |
---|---|
'stringA ' == 'stringB ' |
stringA 가 stringB 와 같으면 true 로 평가됩니다.예시: Condition="'$(Configuration)'=='DEBUG'" 간단한 영숫자 문자열 또는 부울 값에는 작은따옴표가 필요하지 않습니다. 그러나 빈 값에는 작은따옴표가 필요합니다. 이 검사는 대/소문자를 구분하지 않습니다. |
'stringA' != 'stringB' |
가 true 같지 않은지 stringA 평가합니다 stringB .예시: Condition="'$(Configuration)'!='DEBUG'" 간단한 영숫자 문자열 또는 부울 값에는 작은따옴표가 필요하지 않습니다. 그러나 빈 값에는 작은따옴표가 필요합니다. 이 검사는 대/소문자를 구분하지 않습니다. |
<, >= <, >= | 피연산자의 숫자 값을 평가합니다. 관계형 평가가 true이면 true 를 반환합니다. 피연산자는 10진수 또는 16진수나 4개의 파트로 이루어지고 점으로 구분된 버전으로 평가되어야 합니다. 16진수는 .로 0x 시작해야 합니다. 참고: XML에서는 < 및 > 문자를 이스케이프해야 합니다. < 기호는 < 로 표시됩니다. > 기호는 > 로 표시됩니다. |
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