항목 정의
MSBuild 2.0에서는 ItemGroup 요소를 사용하여 프로젝트 파일의 항목을 정적으로 선언할 수 있지만메타데이터가 모든 항목에 대해 동일한 경우에도 항목 수준에만 메타데이터를 추가할 수 있습니다.MSBuild 3.5에서는 이러한 제한을 해결하는 ItemDefinitionGroup이라는 프로젝트 요소가 새로 도입되었습니다.ItemDefinitionGroup을 사용하면 명명된 항목 형식의 모든 항목에 기본 메타데이터 값을 추가하는 항목 정의 집합을 정의할 수 있습니다.
ItemDefinitionGroup 요소는 프로젝트 파일의 Project 요소 바로 뒤에 표시됩니다.항목 정의는 다음과 같은 기능을 제공합니다.
대상 밖에 있는 항목에 대한 전역 메타데이터 기본값을 정의할 수 있습니다.즉, 동일한 메타데이터가 지정된 형식의 모든 항목에 적용됩니다.
항목 형식에 여러 정의가 있을 수 있습니다.항목 형식에 추가 메타데이터 사양을 추가하면 마지막 사양이 우선적으로 적용됩니다.메타데이터는 속성과 동일한 가져오기 순서를 따릅니다.
메타데이터를 누적할 수 있습니다.예를 들어, CDefines 값은 설정하고 있는 속성에 따라 조건부로 누적됩니다.예를 들면 MT;STD_CALL;DEBUG;UNICODE와 같습니다.
메타데이터를 제거할 수 있습니다.
조건을 사용하여 메타데이터의 포함 여부를 제어할 수 있습니다.
항목 메타데이터 기본값
ItemDefinitionGroup에 정의된 항목 메타데이터는 단지 기본 메타데이터의 선언입니다.메타데이터는 ItemGroup을 사용하여 메타데이터 값을 포함하는 항목을 정의할 경우에만 적용됩니다.
[!참고]
이 항목의 많은 예제에는 ItemDefinitionGroup 요소가 나오지만 해당 ItemGroup 정의는 혼동을 피하기 위해 생략되었습니다.
ItemGroup에 명시적으로 정의된 메타데이터는 ItemDefinitionGroup에 있는 메타데이터보다 우선합니다.ItemDefinitionGroup에 있는 메타데이터는 ItemGroup에 있는 정의되지 않은 메타데이터에 대해서만 적용됩니다.예를 들면 다음과 같습니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemGroup>
<i Include="a">
<o>o1</o>
<n>n2</n>
</i>
</ItemGroup>
이 예제에서 기본 메타데이터 "m"은 항목 "i"에 의해 명시적으로 정의되지 않으므로 항목 "i"에 적용됩니다.그러나 기본 메타데이터 "n"은 항목 "i"에 의해 이미 정의되어 있으므로 항목 "i"에 적용되지 않습니다.
[!참고]
XML 요소 및 매개 변수 이름은 대/소문자를 구분합니다.항목 메타데이터 및 항목/속성 이름은 대/소문자를 구분하지 않습니다.따라서 이름이 대/소문자만 다른 ItemDefinitionGroup 항목은 동일한 ItemGroup으로 처리되어야 합니다.
값 소스
ItemDefinitionGroup에 정의된 메타데이터 값은 다음과 같은 다양한 소스에서 가져올 수 있습니다.
PropertyGroup 속성
ItemDefinitionGroup 항목
ItemDefinitionGroup 항목의 항목 변환
환경 변수
전역 속성(MSBuild.exe 명령줄)
예약 속성
ItemDefinitionGroup 항목의 잘 알려진 메타데이터
CDATA 섹션 <![CDATA[여기에 있는 내용은 구문 분석되지 않음]]>
[!참고]
ItemDefinitionGroup 요소가 ItemGroup 요소보다 먼저 처리되기 때문에 ItemGroup의 항목 메타데이터는 ItemDefinitionGroup 메타데이터 선언에 도움이 되지 않습니다.
누적 및 다중 정의
정의를 추가하거나 여러 ItemDefinitionGroup을 사용할 때는 다음 사항을 고려해야 합니다.
추가 메타데이터 사양이 형식에 추가됩니다.
마지막 사양이 우선적으로 적용됩니다.
여러 ItemDefinitionGroup이 있을 경우 이후의 각 사양을 통해 이전 정의에 해당 메타데이터가 추가됩니다.예를 들면 다음과 같습니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<o>o1</o>
</i>
</ItemDefinitionGroup>
이 예제에서는 메타데이터 "o"가 "m"과 "n"에 추가됩니다.
또한 이전에 정의된 메타데이터 값이 추가될 수도 있습니다.예를 들면 다음과 같습니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
이 예제에서는 메타데이터 "m"(m1)에 대해 이전에 정의된 값이 새 값(m2)에 추가되어 최종 값은 "m1;m2"입니다.
[!참고]
이것은 동일한 ItemDefinitionGroup에서도 발생할 수 있습니다.
이전에 정의된 메타데이터를 재정의하면 마지막 사양이 우선적으로 적용됩니다.다음 예제에서는 메타데이터 "m"의 최종 값이 "m1"에서 "m1a"로 변경됩니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>m1a</m>
</i>
</ItemDefinitionGroup>
ItemDefinitionGroup의 조건 사용
ItemDefinitionGroup의 조건을 사용하여 메타데이터의 포함 여부를 제어할 수 있습니다.예를 들면 다음과 같습니다.
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
이 예제에서는 "Configuration" 속성의 값이 "Debug"일 경우에만 항목 "i"의 기본 메타데이터 "m1"이 포함됩니다.
[!참고]
조건에서는 로컬 메타데이터 참조만 지원됩니다.
이전 ItemDefinitionGroup에 정의된 메타데이터에 대한 참조는 정의 그룹이 아니라 항목에 로컬입니다.즉, 참조 범위는 항목을 기준으로 결정됩니다.예를 들면 다음과 같습니다.
<ItemDefinitionGroup>
<test>
<yes>1</yes>
</test>
<i>
<m Condition="'%(test.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
이 예제에서는 항목 "i"가 Condition에 있는 항목 "test"를 참조합니다.
메타데이터 재정의 및 삭제
ItemDefinitionGroup 요소에 정의된 메타데이터는 해당 메타데이터 값을 빈 값으로 설정하여 이후 ItemDefinitionGroup 요소에서 재정의할 수 있습니다.또한 빈 값으로 설정하여 메타데이터 항목을 효과적으로 삭제할 수도 있습니다.예를 들면 다음과 같습니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m></m>
</i>
</ItemDefinitionGroup>
항목 "i"는 메타데이터 "m"을 여전히 포함하고 있지만 해당 값은 이제 비어 있습니다.
메타데이터 범위
ItemDefinitionGroup은 정의된 위치에 관계없이 정의된 속성과 전역 속성에서 전역 범위를 갖습니다.ItemDefinitionGroup의 기본 메타데이터 정의는 자체 참조될 수 있습니다.예를 들어, 다음 예제에서는 단순 메타데이터 참조를 사용합니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
또한 다음과 같은 정규화된 메타데이터 참조를 사용할 수도 있습니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(i.m);m2</m>
</i>
</ItemDefinitionGroup>
그러나 다음 예제는 올바르지 않습니다.
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>@(x)</m>
</i>
</ItemDefinitionGroup>
MSBuild 3.5부터는 ItemGroup도 자체 참조될 수 있습니다.예를 들면 다음과 같습니다.
<ItemGroup>
<item Include="a">
<m>m1</m>
<m>%(m);m2</m>
</item>
</ItemGroup>