Definições de item

MSBuild2.0 permite a declaração estática de itens em arquivos de projeto usando o ItemGroup elemento. No entanto, metadados podem ser adicionados somente no nível de item, mesmo se os metadados são idêntico para todos os itens. MSBuild3.5 apresenta um elemento do projeto chamado ItemDefinitionGroup que supera essa limitação. ItemDefinitionGroup permite que você defina um conjunto de definições de item, o que adicionar os valores de metadados padrão para todos os itens no tipo de item nomeado.

O ItemDefinitionGroup elemento aparece logo após o projeto elemento do arquivo de projeto. Definições de item fornecem as seguintes funcionalidades:

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

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

  • Metadados podem ser aditivas. 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.

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

Valores padrão de metadados de item

Os metadados de item é definido em um ItemDefinitionGroup são apenas uma declaração de metadados padrão. Os metadados não se aplica a menos que você definir um Item que usa um ItemGroup para conter os valores de metadados.

ObservaçãoObservação

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

Metadados definido explicitamente em um ItemGroup prevalece sobre metadados em ItemDefinitionGroup. Metadados de ItemDefinitionGroup é aplicado somente para metadados indefinido 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, o metadados padrão "m" é aplicada ao Item "i" porque metadados "m" não é definido explicitamente pelo Item "i". No entanto, padrão de metadados "n" não é aplicada ao Item "i" porque metadados "n" já está definido pelo Item "i".

ObservaçãoObservação

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

Fontes de valor

Os valores de metadados é definido em um ItemDefinitionGroup podem vir de várias fontes diferentes, como segue:

  • Propriedade de PropertyGroup

  • Item de um ItemDefinitionGroup

  • Transformação de item em um Item de ItemDefinitionGroup

  • Variável de ambiente

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

  • Propriedade reservada

  • Metadados conhecidos em um Item de um ItemDefinitionGroup

  • Seção CDATA <![CDATA [nada aqui não é analisado]] >

ObservaçãoObservação

Os metadados de item de um ItemGroup não não útil em uma declaração de metadados de ItemDefinitionGroup, porque os elementos de ItemDefinitionGroup são processados antes ItemGroup elementos.

Aditivo e várias definições

Quando você adicionar definições ou usa vários ItemDefinitionGroups, lembre-se de:

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

  • A especificação do última terá precedência.

Quando você tem vários ItemDefinitionGroups, cada especificação subseqüente adiciona seus metadados para a 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" é adicionado à "m" e "n".

Além disso, os 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 previamente definido para metadados "m" (m1) é adicionado ao novo valor (m2), para que o valor final é "m1; m2".

ObservaçãoObservação

Isso também pode ocorrer mesmo ItemDefinitionGroup.

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

<ItemDefinitionGroup>

<i>

<m>m1</m>

</i>

</ItemDefinitionGroup>

<ItemDefinitionGroup>

<i>

<m>m1a</m>

</i>

</ItemDefinitionGroup>

Usando 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>

Neste caso, os metadados padrão "m1" no item "i" está incluído somente se o valor de "Configuração" propriedade é "Debug".

ObservaçãoObservação

Somente referências de metadados local são compatíveis com as condições.

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

<ItemDefinitionGroup>

<test>

<yes>1</yes>

</test>

<i>

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

</i>

</ItemDefinitionGroup>

Neste exemplo, "i" do item referências de item "teste" na condição.

Substituindo e a exclusão de metadados

Metadados definidos em um elemento ItemDefinitionGroup podem ser substituído em um elemento de ItemDefinitionGroup posterior, definindo o valor de metadados em branco. Também é eficaz, você pode excluir um item de metadados, configurando-o para 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 de metadados

ItemDefinitionGroups têm escopo global nas propriedades globais e definidos, onde quer que eles são definidos. As definições de metadados padrão em um ItemDefinitionGroup podem ser de auto-referência. Por exemplo, a seguir usa uma referência de metadados simples:

<ItemDefinitionGroup>

<i>

<m>m1</m>

<m>%(m);m2</m>

</i>

</ItemDefinitionGroup>

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

<ItemDefinitionGroup>

<i>

<m>m1</m>

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

</i>

</ItemDefinitionGroup>

No entanto, a seguir não é válida:

<ItemDefinitionGroup>

<i>

<m>m1</m>

<m>@(x)</m>

</i>

</ItemDefinitionGroup>

A partir de MSBuild 3.5, ItemGroups filhos podem também ser de auto-referência. Por exemplo:

<ItemGroup>

<item Include="a">

<m>m1</m>

<m>%(m);m2</m>

</item>

</ItemGroup>

Consulte também

Conceitos

Processamento em lotes do MSBuild