Definicje elementu
MSBuild2.0 umożliwia deklaracji statycznych elementów w plikach programu project przy użyciu ItemGroup element.Jednakże metadane mogą być dodawane tylko na poziomie elementu, nawet jeśli metadanych jest taka sama dla wszystkich elementów.MSBuild3.5 wprowadza element projektu o nazwie ItemDefinitionGroup który pokonuje tego ograniczenia.ItemDefinitionGroup pozwala zdefiniować zestaw definicji elementu, które dodają wartości metadanych domyślne do wszystkich elementów w polu Typ nazwanego elementu.
ItemDefinitionGroup element, który pojawia się natychmiast po Projekt element pliku projektu.Definicje elementu zapewniają następujące funkcje:
Można zdefiniować domyślne globalnych metadane dla elementów poza obiektem docelowym.Oznacza to, że sam metadane dotyczy wszystkich elementów określonego typu.
Typy towaru może mieć wiele definicji.Gdy specyfikacje dodatkowe metadane są dodane do typu, specyfikacja ostatni ma pierwszeństwo.(Metadane następuje tej samej kolejności importu następujące właściwości).
Metadane mogą być dodatku.Na przykład wartości CDefines są kumulowane warunkowo, w zależności od właściwości, które zostały ustawione.Na przykład: MT;STD_CALL;DEBUG;UNICODE.
Metadane można usunąć.
Warunki, można kontrolować włączenie metadanych.
Wartości domyślne metadanych elementu
Metadane elementu, który jest zdefiniowany w ItemDefinitionGroup jest tylko deklarację domyślnej metadanych.Metadane nie ma zastosowania, chyba że Zdefiniuj element, który używa ItemGroup zawiera wartości metadanych.
[!UWAGA]
W wielu przykładach w tym temacie ItemDefinitionGroup element jest wyświetlany, ale jego odpowiednich definicji ItemGroup zostanie pominięty, dla jasności.
Metadane jawnie zdefiniowane w ItemGroup ma pierwszeństwo przed metadanych w ItemDefinitionGroup.Metadane w ItemDefinitionGroup jest stosowany tylko do niezdefiniowanego metadanych w ItemGroup.Na przykład:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemGroup>
<i Include="a">
<o>o1</o>
<n>n2</n>
</i>
</ItemGroup>
W tym przykładzie metadanych domyślny "m" jest zastosować do elementu "i", ponieważ metadane "m" nie jest jawnie zdefiniowane przez element "i".Jednak domyślną metadane "n" nie jest stosowana do elementu "i", ponieważ metadane "n" jest już zdefiniowany przez element "i".
[!UWAGA]
Nazwy elementów XML i parametr jest rozróżniana wielkość liter.Metadane elementu i nazwy elementu/właściwości nie jest rozróżniana.W związku z tym ItemDefinitionGroup elementy, które mają nazwy, które różnią się tylko wielkością liter powinny być traktowane jako ten sam ItemGroup.
Wartość źródła
Wartości dla metadanych, który jest zdefiniowany w ItemDefinitionGroup mogą pochodzić z wielu różnych źródeł, następująco:
Właściwość PropertyGroup
Element z ItemDefinitionGroup
Element przekształcenia na element ItemDefinitionGroup
Zmienna środowiskowa
Właściwość globalna (z wiersza polecenia MSBuild.exe)
Właściwość zastrzeżone
Dobrze znane metadanych na element z ItemDefinitionGroup
Sekcja CDATA <![CDATA [coś tu jest nie analizować]] >
[!UWAGA]
Metadane elementu z ItemGroup nie jest przydatne w deklaracji metadane ItemDefinitionGroup, ponieważ elementy ItemDefinitionGroup są przetwarzane przed ItemGroup elementy.
Dodatek i wiele definicji
Podczas dodawania definicji lub korzystania z wielu ItemDefinitionGroups, należy pamiętać o następujących czynności:
Specyfikacja dodatkowe metadane zostanie dodany do typu.
Specyfikacja ostatni ma pierwszeństwo.
Kiedy masz wiele ItemDefinitionGroups, każdej specyfikacji kolejnych dodaje jego metadane poprzedniej definicji.Na przykład:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<o>o1</o>
</i>
</ItemDefinitionGroup>
W tym przykładzie metadanych "o" dodaje się "m" i "n".
Ponadto można również dodawać metadane uprzednio zdefiniowane wartości.Na przykład:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
W tym przykładzie uprzednio zdefiniowane wartości dla metadanych "m" (m1) dodaje się nową wartość (m2), tak, aby była wartość końcową "m1; m2".
[!UWAGA]
Może to także wystąpić w tym samym ItemDefinitionGroup.
Aby zastąpić wcześniej zdefiniowanych metadane, specyfikacja ostatni ma pierwszeństwo.W poniższym przykładzie wartość końcową metadane "m" idzie z "m1" do "m1a".
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>m1a</m>
</i>
</ItemDefinitionGroup>
Używanie warunków w ItemDefinitionGroup
Do sterowania włączenia metadanych, można użyć warunków w ItemDefinitionGroup.Na przykład:
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
W tym przypadku metadane domyślny "m1" elementu "i" jest włączone tylko wtedy, gdy wartość właściwości "Konfigurację" jest "Debug".
[!UWAGA]
Tylko odwołania do metadanych lokalnym są obsługiwane w warunkach.
Odwołania do metadanych zdefiniowane w ItemDefinitionGroup wcześniej są lokalne do elementu, a nie grupy definicji.Oznacza to, że zakres odniesienia są specyficzne dla elementu.Na przykład:
<ItemDefinitionGroup>
<test>
<yes>1</yes>
</test>
<i>
<m Condition="'%(test.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
W tym przykładzie element "i" odwołania elementu "test" w warunku.
Zastępowanie i usuwanie metadanych
Metadane, zdefiniowane w elemencie ItemDefinitionGroup może być zastąpiona w elemencie ItemDefinitionGroup później przez ustawienie wartości metadanych na puste.Można również skutecznie usuwanie elementu metadanych, ustawiając wartość pustą.Na przykład:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m></m>
</i>
</ItemDefinitionGroup>
Element "i" nadal zawiera metadane "m", ale jego wartość jest teraz pusty.
Zakres metadanych
ItemDefinitionGroups mają globalny zakres na zdefiniowane i globalnych właściwości wszędzie tam, gdzie są zdefiniowane.Domyślne definicje metadanych w ItemDefinitionGroup może być międzyrządowej.Na przykład następujące używa odniesienia proste metadanych:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
Można również zmienić odwołanie kwalifikowaną metadanych:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(i.m);m2</m>
</i>
</ItemDefinitionGroup>
Jednakże następujące nie jest prawidłowy:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>@(x)</m>
</i>
</ItemDefinitionGroup>
Począwszy od MSBuild 3.5, ItemGroups może być również międzyrządowej.Na przykład:
<ItemGroup>
<item Include="a">
<m>m1</m>
<m>%(m);m2</m>
</item>
</ItemGroup>