Trabalhar com funções de itens
O código em tarefas e destinos pode chamar funções de item para obter informações sobre os itens no projeto (no MSBuild 4.0 e posterior). Essas funções simplificam a obtenção de itens distintos e são mais rápidas do que fazer loop pelos itens.
Funções de item de cadeia de caracteres
Você pode usar métodos e propriedades de cadeia de caracteres no .NET Framework para operar em qualquer valor de item. Para métodos String, especifique o nome do método. Para propriedades String, especifique o nome da propriedade após "get_".
Para itens que têm várias cadeias de caracteres, o método de cadeia de caracteres ou a propriedade é executado em cada cadeia de caracteres.
O exemplo a seguir mostra como usar essas funções de item de cadeia de caracteres.
<ItemGroup>
<theItem Include="andromeda;tadpole;cartwheel" />
</ItemGroup>
<Target Name = "go">
<Message Text="IndexOf @(theItem->IndexOf('r'))" />
<Message Text="Replace @(theItem->Replace('tadpole', 'pinwheel'))" />
<Message Text="Length @(theItem->get_Length())" />
<Message Text="Chars @(theItem->get_Chars(2))" />
</Target>
<!--
Output:
IndexOf 3;-1;2
Replace andromeda;pinwheel;cartwheel
Length 9;7;9
Chars d;d;r
-->
Funções de item intrínseco
A tabela a seguir lista as funções intrínsecas disponíveis para itens.
Função | Exemplo | Descrição |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Retorna um novo conjunto de itens com um determinado caminho relativo acrescentado a todos os itens de entrada. |
Count |
@(MyItems->Count()) |
Retorna a contagem dos itens. |
DirectoryName |
@(MyItems->DirectoryName()) |
Retorna o equivalente a Path.DirectoryName para cada item. |
Distinct |
@(MyItems->Distinct()) |
Retorna itens que têm valores Include distintos. Os metadados são ignorados. A comparação não diferencia maiúsculas de minúsculas. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Retorna itens que têm valores itemspec distintos. Os metadados são ignorados. A comparação é sensível a maiúsculas e minúsculas. |
Exists |
@(MyItems->Exists()) |
Filtra um conjunto de itens para aqueles que realmente existem no disco. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Dado um conjunto de itens, retorna itens que representam todos os diretórios ancestrais. Nenhuma ordem é garantida. |
Reverse |
@(MyItems->Reverse()) |
Retorna os itens em ordem inversa. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Retorna um boolean para indicar se algum item tem o nome e o valor dos metadados fornecidos. A comparação não diferencia maiúsculas de minúsculas. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Retorna itens com os metadados limpos. Somente o itemspec é mantido. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Retorna itens que têm o nome de metadados fornecido. A comparação não diferencia maiúsculas de minúsculas. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Retorna os valores dos metadados que possuem um nome de metadado específico. Os itens retornados têm os mesmos metadados que os valores de origem. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Retorna itens que têm o nome e o valor de metadados fornecidos. A comparação não diferencia maiúsculas de minúsculas. |
Nota
Exists
pode ser usado também em outros contextos; em condições do MSBuild , por exemplo, Condition="Exists('path')"
; ou em funções estáticas de propriedade , por exemplo, $([System.IO.File]::Exists("path"))
.
O exemplo a seguir mostra como usar funções de item intrínsecas.
<ItemGroup>
<TheItem Include="first">
<Plant>geranium</Plant>
</TheItem>
<TheItem Include="second">
<Plant>algae</Plant>
</TheItem>
<TheItem Include="third">
<Plant>geranium</Plant>
</TheItem>
</ItemGroup>
<Target Name="go">
<Message Text="MetaData: @(TheItem->Metadata('Plant'))" />
<Message Text="HasMetadata: @(theItem->HasMetadata('Plant'))" />
<Message Text="WithMetadataValue: @(TheItem->WithMetadataValue('Plant', 'geranium'))" />
<Message Text=" " />
<Message Text="Count: @(theItem->Count())" />
<Message Text="Reverse: @(theItem->Reverse())" />
</Target>
<!--
Output:
MetaData: geranium;algae;geranium
HasMetadata: first;second;third
WithMetadataValue: first;third
Count: 3
Reverse: third;second;first
-->
Chamando um método String
Se uma função de item não estiver disponível que corresponda ao seu cenário, você poderá obter um efeito semelhante criando um objeto de cadeia de caracteres a partir dos metadados usando a função de propriedade new
e chamar qualquer método String
nele. Por exemplo, o código a seguir usa uma pesquisa de subcadeia de caracteres para filtrar uma lista de itens em um destino.
<Project>
<PropertyGroup>
<SearchString>abc</SearchString>
</PropertyGroup>
<ItemGroup>
<UnfilteredList Include="abcdef;abc;def;xyz"></UnfilteredList>
</ItemGroup>
<Target Name="FilterItemList">
<ItemGroup>
<FilteredList Include="@(UnfilteredList)" Condition="$([System.String]::new('%(UnfilteredList.Identity)').Contains($(SearchString)))"></FilteredList>
</ItemGroup>
<Message Text="Result: @(FilteredList)"/>
</Target>
</Project>
Detectando duplicatas ao usar a função de item de metadados
A função de item Metadata
preserva os metadados originais dos itens de origem. Isso tem algumas implicações ao considerar se os itens retornados são duplicados ou não. Para controlar como os itens duplicados são tratados, você pode usar o atributo KeepDuplicates. Você também pode remover os metadados, se não forem necessários, adicionando o RemoveMetadata; nesse caso, somente os próprios valores são considerados ao detectar duplicatas.
<Target Name="MetadataToItem">
<ItemGroup>
<Sample Include="AAA" SomeItems="1;2;3" />
<Sample Include="BBB" SomeItems="3;4;5" />
</ItemGroup>
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" />
</ItemGroup>
<Message Text="AllSomeItems is @(AllSomeItems)" />
</Target>
A saída é a seguinte:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
A seguinte alteração no código faz com que o valor do item duplicado seja detectado e removido com êxito:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
Funções de condição do MSBuild
A função HasTrailingSlash
não é uma função de item. Ele está disponível para uso com o atributo Condition
. Veja as condições do MSBuild .
Conteúdo relacionado
Você também pode usar atributos para executar operações em listas de itens, como filtragem em metadados de item. Para obter mais informações, consulte Itens.