다음을 통해 공유


항목 정의

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"이 Item "i"에 의해 명시적으로 정의되지 않았기 때문에 기본 메타데이터 "m"이 Item "i"에 적용됩니다. 그러나 메타데이터 "n"이 Item "i"에 이미 정의되어 있으므로 기본 메타데이터 "n"은 항목 "i"에 적용되지 않습니다.

비고

XML 요소 및 매개 변수 이름은 대/소문자를 구분합니다. 항목 메타데이터 및 항목/속성 이름은 대/소문자를 구분하지 않습니다. 따라서 대/소문자만 다른 이름을 가진 ItemDefinitionGroup 항목은 동일한 ItemGroup으로 처리되어야 합니다.

값 원본

ItemDefinitionGroup에 정의된 메타데이터의 값은 다음과 같이 다양한 원본에서 가져올 수 있습니다.

  • PropertyGroup 속성

  • ItemDefinitionGroup의 항목

  • ItemDefinitionGroup 항목의 항목 변환

  • 환경 변수

  • 전역 속성( MSBuild.exe 명령줄에서)

  • 예약된 속성

  • ItemDefinitionGroup의 항목에 대해 잘 알려진 메타데이터

  • CDATA 섹션 <![ CDATA[여기에 구문 분석되지 않은 항목]]>

비고

ItemDefinitionGroup 요소는 ItemGroup 요소 이전에 처리되므로 ItemGroup의 항목 메타데이터는 ItemDefinitionGroup 메타데이터 선언에서 유용하지 않습니다.

추가 및 여러 정의

정의를 추가하거나 여러 ItemDefinitionGroups를 사용하는 경우 다음을 기억하세요.

  • 추가 메타데이터 사양이 형식에 추가됩니다.

  • 마지막 사양이 우선 적용됩니다.

ItemDefinitionGroups가 여러 개 있는 경우 각 후속 사양은 이전 정의에 해당 메타데이터를 추가합니다. 다음은 그 예입니다.

<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>

이 경우 "구성" 속성 값이 "Debug"인 경우에만 항목 "i"의 기본 메타데이터 "m1"이 포함됩니다.

비고

조건에서는 로컬 메타데이터 참조만 지원됩니다.

이전 ItemDefinitionGroup에 정의된 메타데이터에 대한 참조는 정의 그룹이 아닌 항목에 로컬입니다. 즉, 참조의 범위는 항목별로 다릅니다. 다음은 그 예입니다.

<ItemDefinitionGroup>
    <test>
        <yes>1</yes>
    </test>
    <i>
        <m>m0</m>
        <m Condition="'%(test.yes)'=='1'">m1</m>
    </i>
</ItemDefinitionGroup>

위의 예제에서 항목 "i"는 해당 조건의 항목 "test"를 참조합니다. MSBuild는 ItemDefinitionGroup에서 다른 항목의 메타데이터에 대한 참조를 빈 문자열로 해석하므로 이 조건은 true가 되지 않습니다. 따라서 "m"은 "m0"으로 설정됩니다.

  <ItemDefinitionGroup>
    <i>
      <m>m0</m>
      <yes>1</yes>
      <m Condition="'%(i.yes)'=='1'">m1</m>
    </i>
  </ItemDefinitionGroup>

위의 예제에서 조건은 항목 "예"에 대한 항목 "i"의 메타데이터 값을 참조하므로 "m"이 값 "m1"로 설정됩니다.

메타데이터 재정의 및 삭제

ItemDefinitionGroup 요소에 정의된 메타데이터는 메타데이터 값을 다른 값으로 설정하여 이후 ItemDefinitionGroup 요소에서 재정의할 수 있습니다. 메타데이터 항목을 빈 값으로 설정하여 효과적으로 삭제할 수도 있습니다. 다음은 그 예입니다.

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m></m>
    </i>
</ItemDefinitionGroup>

항목 "i"에는 메타데이터 "m"이 여전히 포함되어 있지만 이제 해당 값은 비어 있습니다.

메타데이터 범위

ItemDefinitionGroups는 정의된 위치와 전역 속성에 대한 전역 범위를 가집니다. 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부터 ItemGroups는 자체 참조일 수도 있습니다. 다음은 그 예입니다.

<ItemGroup>
    <item Include="a">
        <m>m1</m>
        <m>%(m);m2</m>
    </item>
</ItemGroup>