Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
MSBuild 2.0 ermöglicht die statische Deklaration von Elementen in Projektdateien mithilfe des ItemGroup-Elements . Metadaten können jedoch nur auf Elementebene hinzugefügt werden, auch wenn die Metadaten für alle Elemente identisch sind. Ab MSBuild 3.5 überwindet ein Projektelement mit dem Namen ItemDefinitionGroup diese Einschränkung. Mit ItemDefinitionGroup können Sie eine Gruppe von Elementdefinitionen definieren, die allen Elementen im benannten Elementtyp Standardmetadatenwerte hinzufügen.
Das ItemDefinitionGroup-Element wird unmittelbar nach dem Project-Element der Projektdatei angezeigt. Elementdefinitionen bieten die folgenden Funktionen:
Sie können globale Standardmetadaten für Elemente außerhalb eines Ziels definieren. Das heißt, die gleichen Metadaten gelten für alle Elemente des angegebenen Typs.
Elementtypen können mehrere Definitionen aufweisen. Wenn dem Typ zusätzliche Metadatenspezifikationen hinzugefügt werden, hat die letzte Spezifikation Vorrang. (Die Metadaten folgen der gleichen Importreihenfolge wie Eigenschaften.)
Metadaten können additiv sein. Beispielsweise werden CDefines-Werte abhängig von den festgelegten Eigenschaften bedingt akkumuliert. Beispiel:
MT;STD_CALL;DEBUG;UNICODE.Metadaten können entfernt werden.
Bedingungen können verwendet werden, um die Einbeziehung von Metadaten zu steuern.
Standardwerte für Elementmetadaten
Elementmetadaten, die in einer ItemDefinitionGroup definiert sind, sind nur eine Deklaration von Standardmetadaten. Die Metadaten gelten nicht, es sei denn, Sie definieren ein Element, das eine ItemGroup verwendet, um die Metadatenwerte zu enthalten.
Hinweis
In vielen Beispielen in diesem Thema wird ein ItemDefinitionGroup-Element angezeigt, die entsprechende ItemGroup-Definition wird jedoch aus Gründen der Übersichtlichkeit weggelassen.
In einer ItemGroup explizit definierte Metadaten haben Vorrang vor Metadaten in ItemDefinitionGroup. Metadaten in ItemDefinitionGroup werden nur für nicht definierte Metadaten in einer ItemGroup angewendet. Beispiel:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemGroup>
<i Include="a">
<o>o1</o>
<n>n2</n>
</i>
</ItemGroup>
In diesem Beispiel wird die Standardmetadaten "m" auf Element "i" angewendet, da metadaten "m" nicht explizit durch Element "i" definiert werden. Standardmetadaten "n" werden jedoch nicht auf Element "i" angewendet, da metadaten "n" bereits durch Element "i" definiert sind.
Hinweis
BEI XML-Element- und Parameternamen wird die Groß-/Kleinschreibung beachtet. Elementmetadaten und Element-/Eigenschaftsnamen werden nicht zwischen Groß- und Kleinschreibung unterschieden. Daher sollten ItemDefinitionGroup-Elemente mit Namen, die sich nur nach Groß-/Kleinschreibung unterscheiden, als dieselbe ItemGroup behandelt werden.
Wertquellen
Die Werte für Metadaten, die in einer ItemDefinitionGroup definiert sind, können aus vielen verschiedenen Quellen stammen, wie folgt:
PropertyGroup-Eigenschaft
Element aus einer ItemDefinitionGroup
Elementtransformation für ein ItemDefinitionGroup-Element
Umgebungsvariable
Globale Eigenschaft (aus der BefehlszeileMSBuild.exe )
Reserved-Eigenschaft
Bekannte Metadaten für ein Element aus einer ItemDefinitionGroup
CDATA-Abschnitt <![ CDATA[alles hier ist nicht analysiert]]>
Hinweis
Elementmetadaten aus einer ItemGroup sind in einer ItemDefinitionGroup-Metadatendeklaration nicht hilfreich, da ItemDefinitionGroup-Elemente vor ItemGroup-Elementen verarbeitet werden.
Additive und mehrere Definitionen
Wenn Sie Definitionen hinzufügen oder mehrere ItemDefinitionGroups verwenden, denken Sie daran:
Zusätzliche Metadatenspezifikation wird dem Typ hinzugefügt.
Die letzte Spezifikation hat Vorrang.
Wenn Sie über mehrere ItemDefinitionGroups verfügen, fügt jede nachfolgende Spezifikation der vorherigen Definition ihre Metadaten hinzu. Beispiel:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<o>o1</o>
</i>
</ItemDefinitionGroup>
In diesem Beispiel werden die Metadaten "o" zu "m" und "n" hinzugefügt.
Darüber hinaus können zuvor definierte Metadatenwerte ebenfalls hinzugefügt werden. Beispiel:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
In diesem Beispiel wird der zuvor definierte Wert für metadaten "m1" (m1) dem neuen Wert (m2) hinzugefügt, sodass der Endwert "m1" lautet; m2".
Hinweis
Dies kann auch in derselben ItemDefinitionGroup auftreten.
Wenn Sie die zuvor definierten Metadaten außer Kraft setzen, hat die letzte Spezifikation Vorrang. Im folgenden Beispiel wird der endgültige Wert der Metadaten "m" von "m1" bis "m1a" verwendet.
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>m1a</m>
</i>
</ItemDefinitionGroup>
Verwenden von Bedingungen in einer ItemDefinitionGroup
Sie können Bedingungen in einer ItemDefinitionGroup verwenden, um die Aufnahme von Metadaten zu steuern. Beispiel:
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
In diesem Fall ist die Standardmetadaten "m1" für Element "i" nur enthalten, wenn der Wert der Eigenschaft "Configuration" "Debug" lautet.
Hinweis
Nur lokale Metadatenverweise werden unter Bedingungen unterstützt.
Verweise auf metadaten, die in einer früheren ItemDefinitionGroup definiert sind, sind lokal für das Element, nicht die Definitionsgruppe. Das heißt, der Bereich der Verweise ist elementspezifisch. Beispiel:
<ItemDefinitionGroup>
<test>
<yes>1</yes>
</test>
<i>
<m>m0</m>
<m Condition="'%(test.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
Im obigen Beispiel verweist element "i" in der Bedingung auf das Element "test". Diese Bedingung ist nie wahr, da MSBuild einen Verweis auf die Metadaten eines anderen Elements in einer ItemDefinitionGroup als leere Zeichenfolge interpretiert. Daher wäre "m" auf "m0" festgelegt.
<ItemDefinitionGroup>
<i>
<m>m0</m>
<yes>1</yes>
<m Condition="'%(i.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
Im obigen Beispiel wird "m" auf den Wert "m1" als Metadatenwert "i" für das Element "Ja" festgelegt.
Außerkraftsetzen und Löschen von Metadaten
Metadaten, die in einem ItemDefinitionGroup-Element definiert sind, können in einem späteren ItemDefinitionGroup-Element überschrieben werden, indem der Metadatenwert auf einen anderen Wert festgelegt wird. Sie können ein Metadatenelement auch effektiv löschen, indem Sie es auf einen leeren Wert festlegen. Beispiel:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m></m>
</i>
</ItemDefinitionGroup>
Das Element "i" enthält weiterhin Metadaten "m", aber sein Wert ist jetzt leer.
Umfang der Metadaten
ItemDefinitionGroups verfügen über einen globalen Bereich für definierte und globale Eigenschaften, wo immer sie definiert sind. Standardmetadatendefinitionen in einer ItemDefinitionGroup können selbstreferentisch sein. Im Folgenden wird beispielsweise ein einfacher Metadatenverweis verwendet:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
Ein qualifizierter Metadatenverweis kann auch verwendet werden:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(i.m);m2</m>
</i>
</ItemDefinitionGroup>
Folgendes ist jedoch ungültig:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>@(x)</m>
</i>
</ItemDefinitionGroup>
Ab MSBuild 3.5 können ItemGroups auch selbstreferentisch sein. Beispiel:
<ItemGroup>
<item Include="a">
<m>m1</m>
<m>%(m);m2</m>
</item>
</ItemGroup>