Compartilhar via


Definições de item

O MSBuild 2.0 habilita a declaração estática de itens em arquivos de projeto usando o elemento ItemGroup . No entanto, os metadados podem ser adicionados somente no nível do item, mesmo que os metadados sejam idênticos para todos os itens. A partir do MSBuild 3.5, um elemento de projeto chamado ItemDefinitionGroup supera essa limitação. ItemDefinitionGroup permite definir um conjunto de definições de item, que adicionam valores de metadados padrão a todos os itens no tipo de item nomeado.

O elemento ItemDefinitionGroup aparece imediatamente após o elemento Project do arquivo de projeto. As definições de item fornecem a seguinte funcionalidade:

  • Você pode definir metadados padrão globais para itens fora de um destino. Ou seja, os mesmos metadados se aplicam a todos os itens do tipo especificado.

  • Os tipos de item podem ter várias definições. Quando especificações de metadados adicionais são adicionadas ao tipo, a última especificação tem precedência. (Os metadados seguem a mesma ordem de importação que as propriedades a seguir.)

  • Os metadados podem ser aditivos. Por exemplo, os valores de CDefines são acumulados condicionalmente, dependendo das propriedades que estão sendo definidas. Por exemplo, MT;STD_CALL;DEBUG;UNICODE.

  • Metadados podem ser removidos.

  • As condições podem ser usadas para controlar a inclusão de metadados.

Valores padrão de metadados de item

Os metadados de item definidos em um ItemDefinitionGroup são apenas uma declaração de metadados padrão. Os metadados não se aplicam a menos que você defina um Item que use um ItemGroup para conter os valores de metadados.

Observação

Em muitos dos exemplos neste tópico, um elemento ItemDefinitionGroup é mostrado, mas sua definição de ItemGroup correspondente é omitida para maior clareza.

Metadados definidos explicitamente em um ItemGroup têm precedência sobre metadados em ItemDefinitionGroup. Os metadados em ItemDefinitionGroup são aplicados somente para metadados indefinidos em um ItemGroup. Por exemplo:

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

Neste exemplo, os metadados padrão "m" são aplicados ao Item "i" porque os metadados "m" não são definidos explicitamente pelo Item "i". No entanto, os metadados padrão "n" não são aplicados ao Item "i" porque os metadados "n" já estão definidos pelo Item "i".

Observação

Os nomes de elemento xml e parâmetro diferenciam maiúsculas de minúsculas. Os metadados de item e os nomes item/propriedade não diferenciam maiúsculas de minúsculas. Portanto, os itens ItemDefinitionGroup que têm nomes que diferem apenas por caso devem ser tratados como o mesmo ItemGroup.

Fontes de valor

Os valores para metadados definidos em um ItemDefinitionGroup podem vir de várias fontes diferentes, da seguinte maneira:

  • Propriedade PropertyGroup

  • Item de um ItemDefinitionGroup

  • Transformação de item em um item ItemDefinitionGroup

  • Variável de ambiente

  • Propriedade global (da linha de comando MSBuild.exe )

  • Propriedade reservada

  • Metadados conhecidos em um item de um ItemDefinitionGroup

  • Seção <CDATA ![ CDATA[qualquer coisa aqui não é analisada]]>

Observação

Metadados de item de um ItemGroup não são úteis em uma declaração de metadados ItemDefinitionGroup porque os elementos ItemDefinitionGroup são processados antes dos elementos ItemGroup.

Aditivo e várias definições

Ao adicionar definições ou usar vários ItemDefinitionGroups, lembre-se do seguinte:

  • Especificação de metadados adicional é adicionada ao tipo.

  • A última especificação tem precedência.

Quando você tem vários ItemDefinitionGroups, cada especificação subsequente adiciona seus metadados à definição anterior. Por exemplo:

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

Neste exemplo, os metadados "o" são adicionados a "m" e "n".

Além disso, valores de metadados definidos anteriormente também podem ser adicionados. Por exemplo:

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

Neste exemplo, o valor definido anteriormente para metadados "m" (m1) é adicionado ao novo valor (m2), de modo que o valor final seja "m1; m2".

Observação

Isso também pode ocorrer no mesmo ItemDefinitionGroup.

Quando você substitui os metadados definidos anteriormente, a última especificação tem precedência. No exemplo a seguir, o valor final dos metadados "m" vai de "m1" para "m1a".

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

Usar condições em um ItemDefinitionGroup

Você pode usar condições em um ItemDefinitionGroup para controlar a inclusão de metadados. Por exemplo:

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

Nesse caso, os metadados padrão "m1" no item "i" serão incluídos somente se o valor da propriedade "Configuration" for "Depurar".

Observação

Há suporte apenas para referências de metadados locais em condições.

As referências aos metadados definidos em um ItemDefinitionGroup anterior são locais para o item, não para o grupo de definição. Ou seja, o escopo das referências é específico do item. Por exemplo:

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

No exemplo acima, o item "i" faz referência ao item "test" em sua Condição. Essa Condição nunca será verdadeira porque o MSBuild interpreta uma referência aos metadados de outro item em um ItemDefinitionGroup como a cadeia de caracteres vazia. Portanto, "m" seria definido como "m0".

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

No exemplo acima, "m" seria definido como o valor "m1" como a Condição referencia o item "i"'s metadata value for item "yes".

Substituir e excluir metadados

Metadados definidos em um elemento ItemDefinitionGroup podem ser substituídos em um elemento ItemDefinitionGroup posterior definindo o valor de metadados como outro valor. Você também pode excluir efetivamente um item de metadados definindo-o como um valor vazio. Por exemplo:

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

O item "i" ainda contém metadados "m", mas seu valor agora está vazio.

Escopo dos metadados

ItemDefinitionGroups têm escopo global em propriedades definidas e globais onde quer que sejam definidas. As definições de metadados padrão em um ItemDefinitionGroup podem ser auto-referenciais. Por exemplo, o seguinte usa uma referência de metadados simples:

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

Uma referência de metadados qualificados também pode ser usada:

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

No entanto, o seguinte não é válido:

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

A partir do MSBuild 3.5, Os ItemGroups também podem ser auto-referenciais. Por exemplo:

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