Elemdefiníciók

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>