Trabalhar com funções de item
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 percorrer os itens.
Funções de item de cadeia de caracteres
Você pode usar métodos de cadeia de caracteres e propriedades 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 ou propriedade de cadeia de caracteres é executado em cada uma delas.
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 intrínsecas do item
A tabela abaixo lista as funções intrínsecas disponíveis para os itens.
Função | Exemplo | Descrição |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Retorna um novo conjunto de itens com um determinado caminho relativo anexado a todos os itens de entrada. |
Count |
@(MyItems->Count()) |
Devolve o número de itens. |
DirectoryName |
@(MyItems->DirectoryName()) |
Devolve o equivalente a Path.DirectoryName para cada item. |
Distinct |
@(MyItems->Distinct()) |
Retorna itens que têm valores de 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 de itemspec distintos. Os metadados são ignorados. A comparação diferencia maiúsculas de 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 os itens que representam a totalidade dos diretórios ancestrais. Nenhuma encomenda é garantida. |
Reverse |
@(MyItems->Reverse()) |
Devolve os itens na 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 é sensível a maiúsculas e minúsculas. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Retorna itens com seus metadados limpos. Apenas 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 com o nome especificado. 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 dos metadados fornecidos. A comparação não diferencia maiúsculas de minúsculas. |
Observação
Exists
também pode ser usado em outros contextos; em condições MSBuild, por exemplo Condition="Exists('path')"
; ou em funções de propriedade estática, por exemplo $([System.IO.File]::Exists("path"))
.
O exemplo a seguir mostra como usar funções de item intrínseco.
<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 não estiver disponível uma função de item 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 chamando qualquer método String
nele. Por exemplo, o código a seguir usa uma pesquisa de substring 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>
Detetando duplicatas ao usar a função de item de metadados
A função Metadata
item preserva os metadados originais dos itens de origem. Isso tem algumas implicações ao considerar se os itens devolvidos são duplicados ou não. Para controlar como itens duplicados são manipulados, você pode usar o atributo KeepDuplicates. Você também pode remover os metadados, se não for necessário, adicionando o RemoveMetadata, caso em que apenas os próprios valores são considerados ao detetar 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 resulta na deteção e remoção bem-sucedida do valor do item duplicado:
<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
. Consulte 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 itens. Para obter mais informações, consulte Itens.