항목 정의Item Definitions

MSBuildMSBuild 2.0에서는 ItemGroup 요소를 사용하여 프로젝트 파일에서 항목의 정적 선언을 수행할 수 있습니다. 2.0 enables the static declaration of items in project files by using the ItemGroup element. 그러나 메타데이터는 모든 항목에 대해 동일하더라도 항목 수준에만 추가할 수 있습니다.However, metadata may be added only at the item level, even if the metadata is identical for all items. MSBuildMSBuild 3.5부터 ItemDefinitionGroup이라는 프로젝트 요소가 이 제한 사항을 해결합니다.Starting in MSBuildMSBuild 3.5, a project element named ItemDefinitionGroup overcomes this limitation. ItemDefinitionGroup을 사용하면 명명된 항목 형식의 모든 항목에 기본 메타데이터 값을 추가하는 항목 정의 집합을 정의할 수 있습니다.ItemDefinitionGroup lets you define a set of item definitions, which add default metadata values to all items in the named item type.

ItemDefinitionGroup 요소는 프로젝트 파일의 Project 요소 바로 뒤에 표시됩니다.The ItemDefinitionGroup element appears immediately after the Project element of the project file. 항목 정의는 다음과 같은 기능을 제공합니다.Item definitions provide the following functionality:

  • 대상 외부에 있는 항목에 대한 전역 기본 메타데이터를 정의할 수 있습니다.You can define global default metadata for items outside a target. 즉, 동일한 메타데이터가 지정된 형식의 모든 항목에 적용됩니다.That is, the same metadata applies to all items of the specified type.

  • 항목 형식은 여러 정의를 포함할 수 있습니다.Item types can have multiple definitions. 추가 메타데이터 사양이 형식에 추가되면 마지막 사양이 우선적으로 적용됩니다.When additional metadata specifications are added to the type, the last specification takes precedence. (메타데이터는 속성이 따르는 동일한 가져오기 순서를 따릅니다.)(The metadata follows the same import order as properties follow.)

  • 메타데이터는 가산될 수 있습니다.Metadata can be additive. 예를 들어 CDefines 값은 설정되는 속성에 따라 조건부로 누적됩니다.For example, CDefines values are accumulated conditionally, depending on the properties that are being set. 예를 들어, MT;STD_CALL;DEBUG;UNICODE을 입력합니다.For example, MT;STD_CALL;DEBUG;UNICODE.

  • 메타데이터는 제거될 수 있습니다.Metadata can be removed.

  • 메타데이터의 포함 여부를 제어하는 데 조건을 사용할 수 있습니다.Conditions can be used to control the inclusion of metadata.

항목 메타데이터 기본값Item Metadata Default Values

ItemDefinitionGroup에 정의된 항목 메타데이터는 기본 메타데이터의 선언일 뿐입니다.Item metadata that is defined in an ItemDefinitionGroup is just a declaration of default metadata. 이 메타데이터는 ItemGroup을 사용하여 메타데이터 값을 포함하는 Item을 정의해야만 적용됩니다.The metadata does not apply unless you define an Item that uses an ItemGroup to contain the metadata values.

참고

이 항목에 나오는 대부분의 예제에서는 ItemDefinitionGroup 요소는 표시되지만 해당 ItemGroup 정의는 간결성을 위해 생략되어 있습니다.In many of the examples in this topic, an ItemDefinitionGroup element is shown but its corresponding ItemGroup definition is omitted for clarity.

ItemGroup에 명시적으로 정의된 메타데이터는 ItemDefinitionGroup의 메타데이터보다 우선합니다.Metadata explicitly defined in an ItemGroup takes precedence over metadata in ItemDefinitionGroup. ItemDefinitionGroup의 메타데이터는 ItemGroup의 정의되지 않은 메타데이터에만 적용됩니다.Metadata in ItemDefinitionGroup is applied only for undefined metadata in an ItemGroup. 예:For example:

<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"로 명시적으로 정의되지 않으므로 Item "i"에 적용됩니다.In this example, the default metadata "m" is applied to Item "i" because metadata "m" is not explicitly defined by Item "i". 그러나 기본 메타데이터 "n"은 Item "i"로 이미 정의되어 있으므로 Item "i"에 적용되지 않습니다.However, default metadata "n" is not applied to Item "i" because metadata "n" is already defined by Item "i".

참고

XML 요소 및 매개 변수 이름은 대소문자를 구분합니다.XML Element and Parameter names are case-sensitive. 항목 메타데이터 및 ITEM/속성 이름은 대소문자를 구분하지 않습니다.Item metadata and Item/Property names are not case-sensitive. 따라서 이름에서 대/소문자만 다른 ItemDefinitionGroup 항목은 같은 ItemGroup으로 취급해야 합니다.Therefore, ItemDefinitionGroup items that have names that differ only by case should be treated as the same ItemGroup.

값 소스Value Sources

ItemDefinitionGroup에 정의된 메타데이터 값은 다음과 같은 다양한 소스에서 가져올 수 있습니다.The values for metadata that is defined in an ItemDefinitionGroup can come from many different sources, as follows:

  • PropertyGroup 속성PropertyGroup Property

  • ItemDefinitionGroup의 항목Item from an ItemDefinitionGroup

  • ItemDefinitionGroup 항목의 항목 변환Item transform on an ItemDefinitionGroup Item

  • 환경 변수Environment variable

  • (MSBuild.exe 명령줄의) 전역 속성Global property (from the MSBuild.exe command line)

  • 예약된 속성Reserved property

  • ItemDefinitionGroup의 Item에 대한 잘 알려진 메타데이터Well-known metadata on an Item from an ItemDefinitionGroup

  • CDATA 섹션 <![CDATA[여기에 있는 내용은 구문 분석되지 않음]]>CDATA section <![CDATA[anything here is not parsed]]>

참고

ItemGroup의 항목 메타데이터는 ItemDefinitionGroup 요소가 ItemGroup 요소보다 먼저 처리되므로 ItemDefinitionGroup 메타데이터 선언에서 사용 가능하지 않습니다.Item metadata from an ItemGroup is not useful in an ItemDefinitionGroup metadata declaration because ItemDefinitionGroup elements are processed before ItemGroup elements.

가산 및 다중 정의Additive and Multiple Definitions

정의를 추가하거나 여러 ItemDefinitionGroup을 사용할 때는 다음 사항에 유의하세요.When you add definitions or use multiple ItemDefinitionGroups, remember the following:

  • 추가 메타데이터 사양은 형식에 추가됩니다.Additional metadata specification is added to the type.

  • 마지막 사양이 우선적으로 적용됩니다.The last specification takes precedence.

    여러 ItemDefinitionGroup이 있는 경우 각 후속 사양은 해당 메타데이터를 이전 정의에 추가합니다.When you have multiple ItemDefinitionGroups, each subsequent specification adds its metadata to the previous definition. 예:For example:

<ItemDefinitionGroup>  
    <i>  
        <m>m1</m>  
        <n>n1</n>  
    </i>  
</ItemDefinitionGroup>  
<ItemDefinitionGroup>  
    <i>  
        <o>o1</o>  
    </i>  
</ItemDefinitionGroup>  

이 예제에서는 "o" 메타데이터는 "m"와 "n"에 추가됩니다.In this example, the metadata "o" is added to "m" and "n".

또한 이전에 정의된 메타데이터 값을 추가할 수도 있습니다.In addition, previously defined metadata values can also be added. 예:For example:

<ItemDefinitionGroup>  
    <i>  
        <m>m1</m>  
    </i>  
</ItemDefinitionGroup>  
<ItemDefinitionGroup>  
    <i>  
        <m>%(m);m2</m>  
    </i>  
</ItemDefinitionGroup>    

이 예제에서는 메타데이터 "m"에 대해 이전에 정의된 값 (m1)이 새 값 (m2)에 추가되므로 최종 값은 "m1;m2"가 됩니다.In this example, the previously defined value for metadata "m" (m1) is added to the new value (m2), so that the final value is "m1;m2".

참고

이 작업은 동일한 ItemDefinitionGroup에서도 발생할 수 있습니다.This can also occur in the same ItemDefinitionGroup.

이전에 정의된 메타데이터를 재정의하면 마지막 사양이 우선적으로 적용됩니다.When you override the previously defined metadata, the last specification takes precedence. 다음 예제에서 메타데이터 "m"의 최종 값은 "m1"에서 "m1a"로 이동합니다.In the following example, the final value of metadata "m" goes from "m1" to "m1a".

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

ItemDefinitionGroup에서 조건 사용Using Conditions in an ItemDefinitionGroup

ItemDefinitionGroup에서 조건을 사용하여 메타데이터의 포함 여부를 제어할 수 있습니다.You can use conditions in an ItemDefinitionGroup to control the inclusion of metadata. 예:For example:

<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">  
    <i>  
        <m>m1</m>  
    </i>  
</ItemDefinitionGroup>  

이 경우에 "Configuration" 속성의 값이 "Debug"인 경우에만 항목 "i"의 기본 메타데이터 "m1"이 포함됩니다.In this case, the default metadata "m1" on item "i" is included only if the value of the "Configuration" property is "Debug".

참고

로컬 메타데이터 참조만 조건에서 지원됩니다.Only local metadata references are supported in conditions.

이전 ItemDefinitionGroup에 정의된 메타데이터에 대한 참조는 정의 그룹이 아닌 항목에 로컬입니다.References to metadata defined in an earlier ItemDefinitionGroup are local to the item, not the definition group. 즉, 참조의 범위는 항목별로 고유합니다.That is, the scope of the references are item-specific. 예:For example:

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

위 예제에서 항목 "i"는 해당 Condition의 항목 "test"를 참조합니다.In the above example, item "i" references item "test" in its Condition. MSBuild는 ItemDefinitionGroup의 다른 항목 메타데이터에 대한 참조를 빈 문자열로 해석하기 때문에 이 Condition은 절대 true가 되지 않습니다.This Condition will never be true because MSBuild interprets a reference to another item's metadata in an ItemDefinitionGroup as the empty string. 따라서 "m"은 "m0"로 설정됩니다.Therefore, "m" would be set to "m0."

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

위 예제에서 Condition은 항목 "yes"에 대한 항목 "i"의 메타데이터 값을 참조하므로 값 "m1"으로 설정됩니다.In the above example, "m" would be set to the value "m1" as the Condition references item "i"'s metadata value for item "yes."

메타데이터 재정의 및 삭제Overriding and Deleting Metadata

ItemDefinitionGroup 요소에 정의된 메타데이터는 메타데이터 값을 공백으로 설정하여 나중에 ItemDefinitionGroup 요소에서 재정의할 수 있습니다.Metadata defined in an ItemDefinitionGroup element can be overridden in a later ItemDefinitionGroup element by setting the metadata value to blank. 또한 빈 값으로 설정하면 메타데이터 항목을 효과적으로 삭제할 수 있습니다.You can also effectively delete a metadata item by setting it to an empty value. 예:For example:

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

항목 "i"에는 여전히 메타데이터 "m"이 포함되지만 해당 값은 이제 비어 있습니다.The item "i" still contains metadata "m", but its value is now empty.

메타데이터의 범위Scope of Metadata

ItemDefinitionGroup의 정의된 전역 속성에는 해당 항목이 정의되는 전역 범위가 지정됩니다.ItemDefinitionGroups have global scope on defined and global properties wherever they are defined. ItemDefinitionGroup의 기본 메타데이터 정의는 자체 참조될 수 있습니다.Default metadata definitions in an ItemDefinitionGroup can be self-referential. 예를 들어 다음에서는 간단한 메타데이터 참조를 사용합니다.For example, the following uses a simple metadata reference:

<ItemDefinitionGroup>  
    <i>  
        <m>m1</m>  
        <m>%(m);m2</m>  
    </i>  
</ItemDefinitionGroup>  

정규화된 메타데이터 참조를 사용할 수도 있습니다.A qualified metadata reference can also be used:

<ItemDefinitionGroup>  
    <i>  
      <m>m1</m>  
      <m>%(i.m);m2</m>  
    </i>  
</ItemDefinitionGroup>  

그러나 다음은 유효하지 않습니다.However, the following is not valid:

<ItemDefinitionGroup>  
    <i>  
        <m>m1</m>  
        <m>@(x)</m>  
    </i>  
</ItemDefinitionGroup>  

MSBuildMSBuild 3.5부터 ItemGroup 또한 자체 참조될 수 있습니다.Beginning in MSBuildMSBuild 3.5, ItemGroups can also be self-referential. 예:For example:

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

참고 항목See Also

일괄 처리Batching