Definice položek

MSBuild 2.0 umožňuje statickou deklaraci položek v souborech projektu pomocí ItemGroup elementu. Metadata však mohou být přidána pouze na úrovni položky, i když jsou metadata stejná pro všechny položky. Počínaje msBuild 3.5, element projektu s názvem ItemDefinitionGroup překonat toto omezení. ItemDefinitionGroup umožňuje definovat sadu definic položek, které přidávají výchozí hodnoty metadat do všech položek v pojmenovaném typu položky.

ItemDefinitionGroup element se zobrazí hned za element Project souboru projektu. Definice položek poskytují následující funkce:

  • Můžete definovat globální výchozí metadata pro položky mimo cíl. To znamená, že stejná metadata platí pro všechny položky zadaného typu.

  • Typy položek mohou mít více definic. Při přidání dalších specifikací metadat do typu má přednost poslední specifikace. (Metadata se řídí stejným pořadím importu jako vlastnosti.

  • Metadata můžou být doplňková. Například hodnoty CDefines se shromáždí podmíněně v závislosti na nastavených vlastnostech. Například MT;STD_CALL;DEBUG;UNICODE.

  • Metadata je možné odebrat.

  • Podmínky lze použít k řízení zahrnutí metadat.

Výchozí hodnoty metadat položek

Metadata položek definovaná ve skupině ItemDefinitionGroup jsou pouze deklarace výchozích metadat. Metadata se nevztahují, pokud nedefinujete položku, která používá ItemGroup k zahrnutí hodnot metadat.

Poznámka:

V mnoha příkladech v tomto tématu je zobrazen ItemDefinitionGroup element, ale jeho odpovídající definice ItemGroup je vynechána pro přehlednost.

Metadata explicitně definovaná ve skupině ItemGroup mají přednost před metadaty v ItemDefinitionGroup. Metadata ve skupině ItemDefinitionGroup se použijí pouze pro nedefinovaná metadata v položce ItemGroup. Příklad:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <n>n1</n>
    </i>
</ItemDefinitionGroup>
<ItemGroup>
    <i Include="a">
        <o>o1</o>
        <n>n2</n>
    </i>
</ItemGroup>

V tomto příkladu se na položku "i" použijí výchozí metadata "m", protože metadata "m" nejsou explicitně definována položkou "i". Výchozí metadata "n" se však na položku "i" nepoužijí, protože metadata "n" jsou již definována položkou "i".

Poznámka:

V názvech elementů XML a parametrů se rozlišují malá a velká písmena. Metadata položek a názvy položek/vlastností nerozlišují malá a velká písmena. Proto položky ItemDefinitionGroup, které mají názvy, které se liší pouze písmeny, by měly být považovány za stejné ItemGroup.

Zdroje hodnot

Hodnoty metadat definovaných ve skupině ItemDefinitionGroup mohou pocházet z mnoha různých zdrojů následujícím způsobem:

  • PropertyGroup – vlastnost

  • Položka ze skupiny ItemDefinitionGroup

  • Transformace položky v položce ItemDefinitionGroup

  • Proměnná prostředí

  • Globální vlastnost (z příkazového řádku MSBuild.exe )

  • Rezervovaná vlastnost

  • Známá metadata položky ze skupiny ItemDefinitionGroup

  • Oddíl <CDATA ![ CDATA[nic zde není analyzováno]]>

Poznámka:

Metadata položek z ItemGroup nejsou užitečná v deklaraci metadat ItemDefinitionGroup, protože Elementy ItemDefinitionGroup se zpracovávají před elementy ItemGroup.

Sčítání a více definic

Když přidáváte definice nebo používáte více itemDefinitionGroups, mějte na paměti následující:

  • Do typu se přidá další specifikace metadat.

  • Poslední specifikace má přednost.

Pokud máte více ItemDefinitionGroups, každá následná specifikace přidá jeho metadata do předchozí definice. Příklad:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <n>n1</n>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <o>o1</o>
    </i>
</ItemDefinitionGroup>

V tomto příkladu se metadata "o" přidají do "m" a "n".

Kromě toho je možné přidat také dříve definované hodnoty metadat. Příklad:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m>%(m);m2</m>
    </i>
</ItemDefinitionGroup>

V tomto příkladu se k nové hodnotě (m1) přidá dříve definovaná hodnota pro metadata "m1" (m2), aby konečná hodnota byla "m1; m2".

Poznámka:

Může k tomu dojít také ve stejné položce ItemDefinitionGroup.

Když přepíšete dříve definovaná metadata, bude mít přednost poslední specifikace. V následujícím příkladu je konečná hodnota metadat "m" od "m1" do "m1a".

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m>m1a</m>
    </i>
</ItemDefinitionGroup>

Použití podmínek ve skupině ItemDefinitionGroup

Podmínky v itemDefinitionGroup můžete použít k řízení zahrnutí metadat. Příklad:

<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>

V tomto případě je výchozí metadata "m1" u položky "i" zahrnuta pouze v případě, že hodnota vlastnosti "Configuration" je "Debug".

Poznámka:

V podmínkách jsou podporovány pouze odkazy na místní metadata.

Odkazy na metadata definovaná v dřívější skupině ItemDefinitionGroup jsou místní pro položku, nikoli pro skupinu definic. To znamená, že rozsah odkazů je specifický pro jednotlivé položky. Příklad:

<ItemDefinitionGroup>
    <test>
        <yes>1</yes>
    </test>
    <i>
        <m>m0</m>
        <m Condition="'%(test.yes)'=='1'">m1</m>
    </i>
</ItemDefinitionGroup>

V předchozím příkladu položka "i" odkazuje na položku "test" v podmínce. Tato podmínka nebude nikdy pravdivá, protože nástroj MSBuild interpretuje odkaz na metadata jiné položky v itemDefinitionGroup jako prázdný řetězec. Proto by "m" byla nastavena na "m0".

  <ItemDefinitionGroup>
    <i>
      <m>m0</m>
      <yes>1</yes>
      <m Condition="'%(i.yes)'=='1'">m1</m>
    </i>
  </ItemDefinitionGroup>

V předchozím příkladu by "m" byla nastavena na hodnotu "m1" jako podmínka odkazuje na položku "i"hodnota metadat pro položku "ano".

Přepsání a odstranění metadat

Metadata definovaná v Element ItemDefinitionGroup lze přepsat v pozdější ItemDefinitionGroup element nastavením hodnoty metadat na jinou hodnotu. Položku metadat můžete také efektivně odstranit tak, že ji nastavíte na prázdnou hodnotu. Příklad:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m></m>
    </i>
</ItemDefinitionGroup>

Položka "i" stále obsahuje metadata "m", ale její hodnota je nyní prázdná.

Rozsah metadat

ItemDefinitionGroups mají globální obor definovaných a globálních vlastností všude, kde jsou definovány. Výchozí definice metadat ve skupině ItemDefinitionGroup mohou být odkazující na sebe sama. Následující příklad používá jednoduchý odkaz na metadata:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <m>%(m);m2</m>
    </i>
</ItemDefinitionGroup>

Můžete také použít kvalifikovaný odkaz na metadata:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <m>%(i.m);m2</m>
    </i>
</ItemDefinitionGroup>

Následující kód však není platný:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <m>@(x)</m>
    </i>
</ItemDefinitionGroup>

Počínaje msBuildem 3.5 mohou být také skupiny položek odkazující na sebe. Příklad:

<ItemGroup>
    <item Include="a">
        <m>m1</m>
        <m>%(m);m2</m>
    </item>
</ItemGroup>