Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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>