Praca z funkcjami elementów
Kod w zadaniach i elementach docelowych może wywoływać funkcje elementów, aby uzyskać informacje o elementach w projekcie (w programie MSBuild 4.0 lub nowszym). Te funkcje upraszczają uzyskiwanie odrębnych elementów i są szybsze niż pętle przez elementy.
Funkcje elementów ciągu
Metody i właściwości ciągów w programie .NET Framework umożliwiają działanie na dowolnej wartości elementu. W przypadku String metod określ nazwę metody. Dla String właściwości określ nazwę właściwości po "get_".
W przypadku elementów, które mają wiele ciągów, metoda ciągu lub właściwość jest uruchamiana w każdym ciągu.
W poniższym przykładzie pokazano, jak używać tych funkcji elementów ciągu.
<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
-->
Funkcje elementów wewnętrznych
W poniższej tabeli wymieniono funkcje wewnętrzne dostępne dla elementów.
Funkcja | Przykład | opis |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Zwraca nowy zestaw elementów z daną ścieżką względną dołączona do wszystkich elementów wejściowych. |
Count |
@(MyItems->Count()) |
Zwraca liczbę elementów. |
DirectoryName |
@(MyItems->DirectoryName()) |
Zwraca odpowiednik Path.DirectoryName elementu dla każdego elementu. |
Distinct |
@(MyItems->Distinct()) |
Zwraca elementy, które mają odrębne Include wartości. Metadane są ignorowane. Porównanie jest niewrażliwe na wielkość liter. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Zwraca elementy, które mają odrębne itemspec wartości. Metadane są ignorowane. W porównaniu uwzględniana jest wielkość liter. |
Exists |
@(MyItems->Exists()) |
Filtruje zestaw elementów do tych, które rzeczywiście istnieją na dysku. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Biorąc pod uwagę zestaw elementów, zwraca elementy reprezentujące wszystkie katalogi nadrzędnych. Nie ma gwarancji, że zamówienie nie jest gwarantowane. |
Reverse |
@(MyItems->Reverse()) |
Zwraca elementy w odwrotnej kolejności. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Zwraca wartość , boolean aby wskazać, czy dowolny element ma daną nazwę i wartość metadanych. Porównanie jest niewrażliwe na wielkość liter. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Zwraca elementy z wyczyszczone metadanymi. Tylko element itemspec jest zachowywany. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Zwraca elementy, które mają daną nazwę metadanych. Porównanie jest niewrażliwe na wielkość liter. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Zwraca wartości metadanych, które mają nazwę metadanych. Zwrócone elementy mają te same metadane co wartości źródłowe. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Zwraca elementy, które mają daną nazwę i wartość metadanych. Porównanie jest niewrażliwe na wielkość liter. |
Uwaga
Exists
można również używać w innych kontekstach; w warunkach programu MSBuild, na przykład Condition="Exists('path')"
; lub w funkcjach właściwości statycznych, na przykład $([System.IO.File]::Exists("path"))
.
W poniższym przykładzie pokazano, jak używać funkcji elementów wewnętrznych.
<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
-->
Wykrywanie duplikatów podczas korzystania z funkcji elementu metadanych
Funkcja Metadata
item zachowuje oryginalne metadane elementów źródłowych. Ma to pewne konsekwencje podczas rozważania, czy zwracane elementy są duplikatami, czy nie. Aby kontrolować sposób obsługi zduplikowanych elementów, możesz użyć atrybutu KeepDuplicates. Możesz również usunąć metadane, jeśli nie są potrzebne, dodając metodę RemoveMetadata, w tym przypadku tylko same wartości są brane pod uwagę podczas wykrywania duplikatów.
<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>
Wynik jest następujący:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
Następująca zmiana w kodzie powoduje pomyślne wykrycie i usunięcie zduplikowanej wartości elementu:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
Funkcje warunku programu MSBuild
Funkcja HasTrailingSlash
nie jest funkcją elementu. Jest dostępny do użycia z atrybutem Condition
. Zobacz Warunki programu MSBuild.
Powiązana zawartość
Atrybuty umożliwiają również wykonywanie operacji na listach elementów, takich jak filtrowanie metadanych elementu. Aby uzyskać więcej informacji, zobacz Elementy.