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.

Atrybuty umożliwiają również wykonywanie operacji na listach elementów, takich jak filtrowanie metadanych elementu. Aby uzyskać więcej informacji, zobacz Elementy.