Определения элементов
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>
В этом примере к элементу i применяются метаданные по умолчанию m, так как метаданные m не определены явным образом элементом i. Однако к элементу i не применяются метаданные по умолчанию n, так как метаданные 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>
В этом примере ранее определенное значение для метаданных "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>
В этом примере в элемент i включаются метаданные по умолчанию m1, только если значение свойства Configuration имеет значение Debug.
Примечание.
В условиях поддерживаются только локальные ссылки на метаданные.
Ссылки на метаданные, ранее определенные в ItemDefinitionGroup, являются локальными для элемента, а не для группы определений. То есть область действия ссылок определяется элементом. Например:
<ItemDefinitionGroup>
<test>
<yes>1</yes>
</test>
<i>
<m>m0</m>
<m Condition="'%(test.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
В приведенном выше примере элемент i содержит ссылку на элемент test в условии Condition. Это условие никогда не будет иметь значение true, так как MSBuild интерпретирует ссылку на другие метаданные элемента в ItemDefinitionGroup как пустую строку. Таким образом m будет иметь значение m0.
<ItemDefinitionGroup>
<i>
<m>m0</m>
<yes>1</yes>
<m Condition="'%(i.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
В приведенном выше примере m может быть присвоено значение m1, так как Condition содержит ссылку на значение метаданных элемента i для элемента yes.
Переопределение и удаление метаданных
Метаданные, определенные в элементе 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>