Sdílet prostřednictvím


Práce s funkcemi položek

Kód v úkolech a cílech může volat funkce položek pro získání informací o položkách v projektu (v MSBuildu 4.0 a novějších). Tyto funkce zjednodušují získávání jedinečných položek a jsou rychlejší než procházení položek.

Funkce řetězcových položek

Pomocí řetězcových metod a vlastností v rozhraní .NET Framework můžete pracovat s libovolnou hodnotou položky. Pro String metody zadejte název metody. U vlastností String zadejte název vlastnosti za "get_".

U položek, které mají více řetězců, se stringová metoda nebo atribut spouští na každém řetězci.

Následující příklad ukazuje, jak používat tyto funkce položek řetězce.

<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
  -->

Vnitřní funkce položek

Následující tabulka uvádí vnitřní funkce dostupné pro položky.

Funkce Příklad Popis
Combine @(MyItems->Combine('path')) Vrátí novou sadu položek s danou relativní cestou připojenou ke všem vstupním položkám.
Count @(MyItems->Count()) Vrátí počet položek.
DirectoryName @(MyItems->DirectoryName()) Vrátí ekvivalent Path.DirectoryName pro každou položku.
Distinct @(MyItems->Distinct()) Vrátí položky, které mají jedinečné hodnoty Include. Metadata se ignorují. Porovnání nerozlišuje malá a velká písmena.
DistinctWithCase @(MyItems->DistinctWithCase()) Vrátí položky, které mají jedinečné hodnoty itemspec. Metadata se ignorují. V porovnání se rozlišují malá a velká písmena.
Exists @(MyItems->Exists()) Filtruje sadu položek na položky, které na disku skutečně existují.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Při zadané sadě položek vrátí položky představující všechny nadřazené adresáře. Není zaručená žádná objednávka.
Reverse @(MyItems->Reverse()) Vrátí položky v obráceném pořadí.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) Vrátí boolean označující, jestli má každá položka zadaný název a hodnotu metadat. Porovnání nerozlišuje malá a velká písmena.
ClearMetadata @(MyItems->ClearMetadata()) Vrátí položky s odstraněnými metadaty. Zachová se pouze itemspec.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Vrátí položky s daným názvem metadat. Porovnání nerozlišuje malá a velká písmena.
Metadata @(MyItems->Metadata("MetadataName")) Vrátí hodnoty metadat, jejichž název odpovídá zadanému názvu metadat. Vrácené položky mají stejná metadata jako zdrojové hodnoty.
WithMetadataValue @(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) Vrátí položky s daným názvem a hodnotou metadat. Porovnání nerozlišuje malá a velká písmena.

Poznámka

Exists lze také použít v jiných kontextech; například v podmínkách MSBuild , Condition="Exists('path')"; nebo ve funkcích statických vlastností , $([System.IO.File]::Exists("path")).

Následující příklad ukazuje, jak používat vnitřní funkce položek.

<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
  -->

Volání metody String

Pokud funkce položky není k dispozici, která odpovídá vašemu scénáři, můžete dosáhnout podobného efektu vytvořením objektu řetězce z metadat pomocí funkce vlastnosti new a voláním jakékoli metody String. Například následující kód používá vyhledávání podřetězců k filtrování seznamu položek v cílovém objektu.

<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>

Detekce duplicit při použití funkce položky metadat

Funkce položky Metadata zachovává původní metadata zdrojových položek. To má určité důsledky při zvažování, jestli jsou vrácené položky duplicitní nebo ne. K řízení způsobu zpracování duplicitních položek můžete použít atribut KeepDuplicates. Metadata můžete odebrat také tak, že přidáte RemoveMetadata, v takovém případě se při zjišťování duplicit považují pouze samotné hodnoty.

  <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>

Výstup je následující:

MetadataToItem:
  AllSomeItems is 1;2;3;3;4;5

Následující změna kódu způsobí úspěšné zjištění a odebrání duplicitní hodnoty položky:

    <ItemGroup>
      <AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
    </ItemGroup>

Funkce podmínek nástroje MSBuild

Funkce HasTrailingSlash není funkcí položky. Je k dispozici pro použití s atributem Condition. Viz podmínky nástroje MSBuild.

Můžete také použít atributy k provádění operací se seznamy položek, jako je filtrování podle metadat položek. Další informace naleznete v části Položky.