Definições de item
MSBuild 2,0 permite declarações estático de itens em arquivos de projeto usando o elemento de ItemGroup .Em o entanto, os metadados podem ser adicionados somente em nível do item, mesmo se os metadados são idênticos para todos os itens.MSBuild 3,5 apresenta um elemento de projeto chamado ItemDefinitionGroup que a superar essa limitação.ItemDefinitionGroup permite que você defina um conjunto de definições de item, que adicionam valores padrão de metadados para todos os itens no tipo de item chamado.
O elemento de ItemDefinitionGroup aparece imediatamente após o elemento de Projeto 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.Isto é, os mesmos metadados aplicam-se a todos os itens do tipo especificado.
Os tipos de item podem ter várias definições.Quando as especificações adicionais de metadados são adicionadas ao tipo, a especificação a mais recente tem precedência.(Os metadados seguem a mesma ordem de importação que seguem as propriedades.)
os metadados podem ser aditivos.Por exemplo, os valores de CDefines são acumulados condicionalmente, dependendo das propriedades que são definidas.Por exemplo, MT;STD_CALL;DEBUG;UNICODE.
os 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 que é definido 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 ItemGroup use um para conter os valores de metadados.
Observação |
---|
Em muitos dos exemplos em este tópico, um elemento de ItemDefinitionGroup que é mostrado mas sua definição de ItemGroup correspondente é omitida para maior clareza. |
Os metadados definidas explicitamente em um ItemGroup têm precedência sobre metadados em ItemDefinitionGroup.Os metadados são aplicados em ItemDefinitionGroup somente para os metadados indefinidas 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>
Em esse exemplo, os metadados padrão “m” são aplicados ao item “i” porque os metadados “m” não são explicitamente definidos pelo item “i”.Em o entanto, os metadados padrão “em” não são aplicados ao item “i” porque os metadados “em” já estão definidos pelo item “i”.
Observação |
---|
Os nomes de elemento XML e de parâmetro 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 que diferem somente por casos devem ser tratados como o mesmo ItemGroup. |
Fontes de valor
Os valores para os metadados que é definido em um ItemDefinitionGroup podem vir de várias fontes diferentes, como segue:
propriedade de PropertyGroup
item de um ItemDefinitionGroup
O item transformações em um item de ItemDefinitionGroup
variável de ambiente
Propriedade global (de linha de comando MSBuild.exe)
propriedade reservado
metadados conhecidos em um item de um ItemDefinitionGroup
Seção CDATA <![CDATA[qualquer coisa aqui é analisado]]>
Observação |
---|
Os metadados de um item de ItemGroup não são úteis em uma declaração de metadados de ItemDefinitionGroup porque os elementos de ItemDefinitionGroup são processados antes de elementos de ItemGroup. |
Definições aditivas e várias
Quando você adiciona definições ou uso mais ItemDefinitionGroups, lembre-se do seguinte:
A especificação extra de metadados é adicionada ao tipo.
A especificação a mais recente tem precedência.
Quando você tiver vários ItemDefinitionGroups, cada especificação subseqüente adiciona os 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>
Em esse exemplo, os metadados “o” são adicionados a “m” a” e “em.
Além de isso, os valores definidos anteriormente de metadados também podem ser adicionados.Por exemplo:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
Em esse exemplo, o valor definido anteriormente para os metadados “m” m1 () é adicionado ao novo valor (m2), para que o valor final é “m1; m2”.
Observação |
---|
Isso também pode ocorrer no mesmo ItemDefinitionGroup. |
Quando você substituir os metadados definidos anteriormente, a especificação a mais recente tem precedência.Em o exemplo, o valor final dos metadados “m” go de “m1” a “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>
Em esse caso, os metadados padrão “m1” no item “me” sou incluído somente se o valor da propriedade “configurações” é “depuração”.
Observação |
---|
Somente as referências locais de metadados são suportadas em condições. |
Referências para os metadados definidos em um ItemDefinitionGroup anterior são locais para o item, não definição de grupo.Isto é, o escopo de referências é itens - específico.Por exemplo:
<ItemDefinitionGroup>
<test>
<yes>1</yes>
</test>
<i>
<m Condition="'%(test.yes)'=='1'">m1</m>
</i>
</ItemDefinitionGroup>
Em esse exemplo, item “i” item “” teste de referências em condição.
Substituindo e exclusão de metadados
Os metadados definidos em um elemento de ItemDefinitionGroup podem ser substituídos em um elemento posterior de ItemDefinitionGroup definindo o valor de metadados para nula.Você também pode efetivamente excluir um item de metadados definindo o para um valor vazio.Por exemplo:
<ItemDefinitionGroup>
<i>
<m>m1</m>
</i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<i>
<m></m>
</i>
</ItemDefinitionGroup>
O item “me” ainda contenho os metadados “m”, mas seu valor agora está vazia.
Escopo de metadados
ItemDefinitionGroups tem escopo global em propriedades definidas e globais onde quer que são definidos.As definições padrão de metadados em um ItemDefinitionGroup podem ser são referenciais.Por exemplo, o seguinte usa metadados referenciam simples:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(m);m2</m>
</i>
</ItemDefinitionGroup>
Uma referência qualificada de metadados também pode ser usada:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>%(i.m);m2</m>
</i>
</ItemDefinitionGroup>
Em o entanto, o seguinte é válido:
<ItemDefinitionGroup>
<i>
<m>m1</m>
<m>@(x)</m>
</i>
</ItemDefinitionGroup>
Iniciando em MSBuild 3,5, ItemGroups também pode ser são referencial.Por exemplo:
<ItemGroup>
<item Include="a">
<m>m1</m>
<m>%(m);m2</m>
</item>
</ItemGroup>