Поделиться через


Определения элементов

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", так как метаданные "m" не определяются явным образом элементом "i". Однако метаданные по умолчанию "n" не применяются к элементу "i", так как метаданные "n" уже определены элементом "i".

Замечание

Имена XML-элементов и параметров чувствительны к регистру. Метаданные элементов и имена элементов и свойств не учитывает регистр. Поэтому элементы ItemDefinitionGroup с именами, которые отличаются только по регистру, должны рассматриваться как те же элементы ItemGroup.

Источники значений

Значения метаданных, определенных в ItemDefinitionGroup, могут поступать из множества различных источников, как показано ниже.

  • Свойство PropertyGroup

  • Элемент из ItemDefinitionGroup

  • Преобразование элемента в элементе ItemDefinitionGroup

  • Переменная среды

  • Глобальное свойство (из командной строки MSBuild.exe )

  • Зарезервированное свойство

  • Известные метаданные элемента из ItemDefinitionGroup

  • Раздел <CDATA ![ CDATA[что-нибудь здесь не анализируется]]>

Замечание

Метаданные элементов из ItemGroup не полезны в объявлении метаданных ItemDefinitionGroup, так как элементы ItemDefinitionGroup обрабатываются перед элементами ItemGroup.

Аддитивные и несколько определений

При добавлении определений или использовании нескольких 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>

В этом примере ранее определенное значение для метаданных "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>

В этом случае метаданные по умолчанию "m1" элемента "i" включаются только в том случае, если значение свойства Configuration имеет значение Debug.

Замечание

В условиях поддерживаются только локальные ссылки на метаданные.

Ссылки на метаданные, определенные в более ранней itemDefinitionGroup, являются локальными для элемента, а не группы определений. То есть область ссылок зависит от элемента. Рассмотрим пример.

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

В приведенном выше примере элемент "i" ссылается на элемент "test" в своем условии. Это условие никогда не будет верным, так как MSBuild интерпретирует ссылку на метаданные другого элемента в ItemDefinitionGroup как пустую строку. Таким образом, "m" будет иметь значение "m0".

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

В приведенном выше примере параметр "m" будет иметь значение "m1" в качестве значения метаданных элемента "i" элемента метаданных "i" для элемента "да".

Переопределение и удаление метаданных

Метаданные, определенные в элементе 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>