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.
Související obsah
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.