Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az MSBuild 2.0 lehetővé teszi a projektfájlok elemeinek statikus deklarálását az ItemGroup elem használatával. A metaadatok azonban csak az elem szintjén vehetők fel, még akkor is, ha a metaadatok minden elemnél azonosak. Az MSBuild 3.5-től kezdve az ItemDefinitionGroup nevű projektelem leküzdi ezt a korlátozást. Az ItemDefinitionGroup lehetővé teszi elemdefiníciók definiálását, amelyek alapértelmezett metaadat-értékeket adnak hozzá az elnevezett elemtípus összes eleméhez.
Az ItemDefinitionGroup elem közvetlenül a projektfájl Projekt eleme után jelenik meg. Az elemdefiníciók a következő funkciókat biztosítják:
A célon kívüli elemek globális alapértelmezett metaadatait is meghatározhatja. Vagyis ugyanazok a metaadatok vonatkoznak a megadott típus összes elemére.
Az elemtípusok több definícióval is rendelkezhetnek. Ha további metaadat-specifikációkat ad hozzá a típushoz, az utolsó specifikáció elsőbbséget élvez. (A metaadatok ugyanazt az importálási sorrendet követik, mint a tulajdonságok.)
A metaadatok additívak lehetnek. A CDefines-értékek például feltételesen halmozódnak fel a beállított tulajdonságoktól függően. Például:
MT;STD_CALL;DEBUG;UNICODE.A metaadatok eltávolíthatók.
A feltételek a metaadatok felvételének szabályozására használhatók.
Elem metaadatainak alapértelmezett értékei
Az ItemDefinitionGroupban definiált elem-metaadatok csak az alapértelmezett metaadatok deklarálása. A metaadatok csak akkor érvényesek, ha olyan elemet határoz meg, amely egy ItemGroup használatával tartalmazza a metaadatok értékeit.
Megjegyzés:
A jelen témakör számos példájában megjelenik egy ItemDefinitionGroup elem, de a megfelelő ItemGroup-definíció hiányzik az egyértelműség kedvéért.
Az Elemcsoportban explicit módon definiált metaadatok elsőbbséget élveznek az ItemDefinitionGroup metaadataival szemben. Az ItemDefinitionGroup metaadatai csak az ItemGroup nem definiált metaadataira vonatkoznak. Például:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemGroup>
<i Include="a">
<o>o1</o>
<n>n2</n>
</i>
</ItemGroup>
Ebben a példában az alapértelmezett "m" metaadatok az "i" elemre lesznek alkalmazva, mivel az "m" metaadatokat nem definiálja explicit módon az "i" elem. Az "n" alapértelmezett metaadatok azonban nem lesznek alkalmazva az "i" elemre, mert az "n" metaadatokat már definiálta az "i" elem.
Megjegyzés:
Az XML-elem és a paraméter neve megkülönbözteti a kis- és nagybetűket. Az elem metaadatai és az elem-/tulajdonságnevek nem megkülönböztetik a kis- és nagybetűket. Ezért az olyan ItemDefinitionGroup elemeket, amelyek neve csak esetenként különbözik, ugyanazzal az ItemGroup-tal kell kezelni.
Értékforrások
Az ItemDefinitionGroupban definiált metaadatok értékei számos különböző forrásból származhatnak, az alábbiak szerint:
PropertyGroup tulajdonság
Elem egy ItemDefinitionGroup-ból
Elemátalakítás egy ItemDefinitionGroup-elemen
Környezet változó
Globális tulajdonság (a MSBuild.exe parancssorból)
Fenntartott tulajdonság
Egy ItemDefinitionGroup elem jól ismert metaadatai
CDATA szakasz <![ CDATA[itt minden nincs elemezve]]>
Megjegyzés:
Az ItemGroup elem metaadatai nem hasznosak az ItemDefinitionGroup metaadat-deklarációjában, mert az ItemDefinitionGroup elemek feldolgozása az ItemGroup-elemek előtt történik.
Additív és több definíció
Definíciók hozzáadásakor vagy több ItemDefinitionGroups használatakor ne feledje a következőket:
A rendszer további metaadat-specifikációt ad hozzá a típushoz.
Az utolsó specifikáció elsőbbséget élvez.
Ha több ItemDefinitionGroups van, minden további specifikáció hozzáadja a metaadatokat az előző definícióhoz. Például:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<n>n1</n>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<o>o1</o>
</i>
</ItemDefinitionGroup>
Ebben a példában az "o" metaadatok hozzá lesznek adva az "m" és az "n" értékhez.
Emellett a korábban definiált metaadat-értékek is hozzáadhatók. Például:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
Ebben a példában az "m" (m1) metaadatok korábban definiált értéke hozzáadódik az új értékhez (m2), hogy a végső érték "m1; m2".
Megjegyzés:
Ez ugyanabban az ItemDefinitionGroupban is előfordulhat.
A korábban definiált metaadatok felülbírálásakor az utolsó specifikáció elsőbbséget élvez. Az alábbi példában az "m" metaadatok végső értéke "m1" és "m1a" között van.
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>m1a</m>
</i>
</ItemDefinitionGroup>
Feltételek használata egy ItemDefinitionGroupban
Az ItemDefinitionGroupban feltételek használatával szabályozhatja a metaadatok felvételét. Például:
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
Ebben az esetben az "i" elem "m1" alapértelmezett metaadatai csak akkor jelennek meg, ha a "Configuration" tulajdonság értéke "Hibakeresés".
Megjegyzés:
A feltételek csak a helyi metaadat-hivatkozásokat támogatják.
A korábbi ItemDefinitionGroup-ban definiált metaadatokra mutató hivatkozások az elemhez tartoznak, nem a definíciócsoporthoz. Vagyis a hivatkozások hatóköre elemspecifikus. Például:
<ItemDefinitionGroup>
<test>
<yes>1</yes>
</test>
<i>
<m>m0</m>
<m Condition="'%(test.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
A fenti példában az "i" elem a feltétel "teszt" elemére hivatkozik. Ez a feltétel soha nem lesz igaz, mert az MSBuild üres sztringként értelmezi egy másik elem metaadataira mutató hivatkozást egy ItemDefinitionGroupban. Ezért az "m" értéke "m0".
<ItemDefinitionGroup>
<i>
<m>m0</m>
<yes>1</yes>
<m Condition="'%(i.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
A fenti példában az "m" értéke "m1" lesz, mivel a Feltétel az "i" elem metaadatértékére hivatkozik az "igen" elemhez.
Metaadatok felülbírálása és törlése
Az ItemDefinitionGroup elemben definiált metaadatok felülírhatók egy későbbi ItemDefinitionGroup elemben a metaadatok értékének másik értékre állításával. A metaadatelemeket úgy is hatékonyan törölheti, ha üres értékre állítja. Például:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m></m>
</i>
</ItemDefinitionGroup>
Az "i" elem továbbra is tartalmazza az "m" metaadatokat, de az értéke üres.
Metaadatok hatóköre
Az ItemDefinitionGroups globális hatókörrel rendelkezik a definiált és a globális tulajdonságokon, bárhol is legyenek definiálva. Az ItemDefinitionGroup alapértelmezett metaadat-definíciói lehetnek önhivatkozások. A következők például egy egyszerű metaadat-hivatkozást használnak:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
Minősített metaadat-hivatkozás is használható:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(i.m);m2</m>
</i>
</ItemDefinitionGroup>
A következők azonban érvénytelenek:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>@(x)</m>
</i>
</ItemDefinitionGroup>
Az MSBuild 3.5-től kezdődően az ItemGroups is lehet önhivatkozás. Például:
<ItemGroup>
<item Include="a">
<m>m1</m>
<m>%(m);m2</m>
</item>
</ItemGroup>