Dela via


Objektdefinitioner

MSBuild 2.0 möjliggör statisk deklaration av objekt i projektfiler med elementet ItemGroup . Metadata kan dock bara läggas till på objektnivå, även om metadata är identiska för alla objekt. Från och med MSBuild 3.5 övervinner ett projektelement med namnet ItemDefinitionGroup den här begränsningen. Med ItemDefinitionGroup kan du definiera en uppsättning objektdefinitioner som lägger till standardmetadatavärden för alla objekt i den namngivna objekttypen.

Elementet ItemDefinitionGroup visas omedelbart efter projektelementet i projektfilen. Objektdefinitioner tillhandahåller följande funktioner:

  • Du kan definiera globala standardmetadata för objekt utanför ett mål. Det innebär att samma metadata gäller för alla objekt av den angivna typen.

  • Objekttyper kan ha flera definitioner. När ytterligare metadataspecifikationer läggs till i typen har den senaste specifikationen företräde. (Metadata följer samma importordning som egenskaperna följer.)

  • Metadata kan vara additiva. Till exempel ackumuleras CDefines-värden villkorligt, beroende på vilka egenskaper som anges. Till exempel MT;STD_CALL;DEBUG;UNICODE.

  • Metadata kan tas bort.

  • Villkor kan användas för att styra inkluderingen av metadata.

Standardvärden för objektmetadata

Objektmetadata som definieras i en ItemDefinitionGroup är bara en deklaration av standardmetadata. Metadata gäller inte om du inte definierar ett objekt som använder en ItemGroup för att innehålla metadatavärdena.

Anmärkning

I många av exemplen i det här avsnittet visas ett ItemDefinitionGroup-element, men motsvarande ItemGroup-definition utelämnas för tydlighetens skull.

Metadata som uttryckligen definieras i en ItemGroup har företräde framför metadata i ItemDefinitionGroup. Metadata i ItemDefinitionGroup används endast för odefinierade metadata i en ItemGroup. Till exempel:

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

I det här exemplet tillämpas standardmetadata "m" på objekt "i" eftersom metadata "m" inte uttryckligen definieras av objekt "i". Standardmetadata "n" tillämpas dock inte på objekt "i" eftersom metadata "n" redan har definierats av objekt "i".

Anmärkning

XML-element- och parameternamn är skiftlägeskänsliga. Objektmetadata och Objekt-/egenskapsnamn är inte skiftlägeskänsliga. Därför bör ItemDefinitionGroup-objekt som bara har namn som skiljer sig åt per skiftläge behandlas som samma ItemGroup.

Värdekällor

Värdena för metadata som definieras i en ItemDefinitionGroup kan komma från många olika källor enligt följande:

  • Egenskapen PropertyGroup

  • Objekt från en ItemDefinitionGroup

  • Objekttransformering på ett ItemDefinitionGroup-objekt

  • Miljövariabel

  • Global egenskap (från kommandoradenMSBuild.exe )

  • Reserverad egenskap

  • Välkända metadata för ett objekt från en ItemDefinitionGroup

  • CDATA-avsnitt <![ CDATA[anything here is not parsed]]>

Anmärkning

Objektmetadata från en ItemGroup är inte användbara i en ItemDefinitionGroup-metadatadeklaration eftersom ItemDefinitionGroup-element bearbetas före ItemGroup-element.

Additiv och flera definitioner

Kom ihåg följande när du lägger till definitioner eller använder flera ItemDefinitionGroups:

  • Ytterligare metadataspecifikation läggs till i typen.

  • Den senaste specifikationen har företräde.

När du har flera ItemDefinitionGroups lägger varje efterföljande specifikation till dess metadata i den tidigare definitionen. Till exempel:

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

I det här exemplet läggs metadata "o" till i "m" och "n".

Dessutom kan tidigare definierade metadatavärden läggas till. Till exempel:

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

I det här exemplet läggs det tidigare definierade värdet för metadata "m" (m1) till i det nya värdet (m2), så att det slutliga värdet är "m1; m2".

Anmärkning

Detta kan också inträffa i samma ItemDefinitionGroup.

När du åsidosätter tidigare definierade metadata har den senaste specifikationen företräde. I följande exempel går det slutliga värdet för metadata "m" från "m1" till "m1a".

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

Använda villkor i en ItemDefinitionGroup

Du kan använda villkor i en ItemDefinitionGroup för att styra inkluderingen av metadata. Till exempel:

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

I det här fallet inkluderas standardmetadata "m1" för objektet "i" endast om värdet för egenskapen "Configuration" är "Debug".

Anmärkning

Endast lokala metadatareferenser stöds under förhållanden.

Referenser till metadata som definierats i en tidigare ItemDefinitionGroup är lokala för objektet, inte definitionsgruppen. Omfånget för referenserna är alltså objektspecifikt. Till exempel:

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

I exemplet ovan refererar objektet "i" till objektet "test" i dess Villkor. Det här villkoret kommer aldrig att vara sant eftersom MSBuild tolkar en referens till ett annat objekts metadata i en ItemDefinitionGroup som den tomma strängen. Därför skulle "m" vara inställt på "m0".

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

I exemplet ovan skulle "m" anges till värdet "m1" eftersom villkoret refererar till objektet "i":s metadatavärde för objektet "ja".

Åsidosätta och ta bort metadata

Metadata som definierats i ett ItemDefinitionGroup-element kan åsidosättas i ett senare ItemDefinitionGroup-element genom att ange metadatavärdet till ett annat värde. Du kan också effektivt ta bort ett metadataobjekt genom att ange ett tomt värde. Till exempel:

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

Objektet "i" innehåller fortfarande metadata "m", men värdet är nu tomt.

Metadataomfång

ItemDefinitionGroups har globalt omfång för definierade och globala egenskaper oavsett var de definieras. Standardmetadatadefinitioner i en ItemDefinitionGroup kan vara självrefererande. Följande använder till exempel en enkel metadatareferens:

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

En referens för kvalificerade metadata kan också användas:

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

Följande är dock inte giltigt:

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

Från och med MSBuild 3.5 kan ItemGroups också vara självrefererande. Till exempel:

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