Usare le funzioni degli elementi
Il codice nelle attività e nelle destinazioni può chiamare funzioni elemento per ottenere informazioni sugli elementi del progetto (in MSBuild 4.0 e versioni successive). Queste funzioni semplificano l'ottenere elementi distinti e sono più veloci rispetto all'iterazione sugli elementi.
Funzioni di elemento stringa
È possibile usare metodi stringa e proprietà in .NET Framework per operare su qualsiasi valore di elemento. Per i metodi String, specificare il nome. Per le proprietà String, specificare il nome della proprietà dopo "get_".
Per gli elementi con più stringhe, il metodo stringa o la proprietà vengono eseguiti in ogni stringa.
Nell'esempio seguente viene illustrato come usare queste funzioni di elemento stringa.
<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
-->
Funzioni intrinseche degli elementi
La tabella seguente elenca le funzioni intrinseche disponibili per gli elementi.
Funzione | Esempio | Descrizione |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Restituisce un nuovo set di elementi con un percorso relativo specificato accodato a tutti gli elementi di input. |
Count |
@(MyItems->Count()) |
Restituisce il conteggio degli elementi. |
DirectoryName |
@(MyItems->DirectoryName()) |
Restituisce l'equivalente di Path.DirectoryName per ogni elemento. |
Distinct |
@(MyItems->Distinct()) |
Restituisce gli elementi con valori Include distinti. I metadati vengono ignorati. Il confronto non fa distinzione tra maiuscole e minuscole. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Restituisce gli elementi con valori itemspec distinti. I metadati vengono ignorati. Il confronto fa distinzione tra maiuscole e minuscole. |
Exists |
@(MyItems->Exists()) |
Filtra un set di elementi per quelli effettivamente esistenti su disco. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Dato un insieme di elementi, restituisce elementi che rappresentano tutte le directory antenate. Non è garantito alcun ordine. |
Reverse |
@(MyItems->Reverse()) |
Restituisce gli elementi in ordine inverso. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Restituisce un boolean per indicare se un elemento ha il nome e il valore dei metadati specificati. Il confronto non fa distinzione tra maiuscole e minuscole. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Restituisce gli elementi con i relativi metadati cancellati. Viene mantenuto solo il itemspec . |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Restituisce gli elementi con il nome dei metadati specificato. Il confronto è insensibile alle maiuscole. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Restituisce i valori dei metadati con il nome dei metadati. Gli elementi restituiti hanno gli stessi metadati dei valori di origine. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Restituisce gli elementi con il nome e il valore dei metadati specificati. Il confronto non fa distinzione tra maiuscole e minuscole. |
Nota
Exists
possono essere usati anche in altri contesti; in condizioni di MSBuild, ad esempio Condition="Exists('path')"
; oppure in funzioni di proprietà statiche, ad esempio $([System.IO.File]::Exists("path"))
.
Nell'esempio seguente viene illustrato come usare le funzioni intrinseche degli elementi.
<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
-->
Chiamata di un metodo String
Se una funzione elemento non è disponibile che corrisponde allo scenario, è possibile ottenere un effetto simile creando un oggetto stringa dai metadati usando la funzione della proprietà new
e chiamare qualsiasi metodo String
su di esso. Ad esempio, il codice seguente usa una ricerca di sottostringa per filtrare un elenco di elementi in una destinazione.
<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>
Rilevamento di duplicati quando si usa la funzione Elemento metadati
La funzione elemento Metadata
mantiene i metadati originali degli elementi di origine. Ciò ha alcune implicazioni quando si valuta se gli elementi restituiti sono duplicati o meno. Per controllare la modalità di gestione degli elementi duplicati, è possibile usare l'attributo KeepDuplicates. È anche possibile rimuovere i metadati, se non è necessario, aggiungendo il RemoveMetadata, nel qual caso vengono considerati solo i valori stessi durante il rilevamento di duplicati.
<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>
L'output è il seguente:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
La modifica seguente al codice comporta il rilevamento e la rimozione del valore dell'elemento duplicato:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
Funzioni di condizione DI MSBuild
La funzione HasTrailingSlash
non è una funzione di elemento. È disponibile per l'uso con l'attributo Condition
. Consultare le condizioni di MSBuild .
Contenuto correlato
È anche possibile usare gli attributi per eseguire operazioni sugli elenchi di elementi, ad esempio filtrare i metadati degli elementi. Per altre informazioni, vedere Items.