Bekerja dengan fungsi item
Kode dalam tugas dan target dapat memanggil fungsi item untuk mendapatkan informasi tentang item dalam proyek (di MSBuild 4.0 dan yang lebih baru). Fungsi-fungsi ini menyederhanakan proses mendapatkan item yang berbeda dan lebih cepat daripada mengiterasi melalui item-item tersebut.
Fungsi dari item string
Anda dapat menggunakan metode string dan properti di .NET Framework untuk beroperasi pada nilai item apa pun. Untuk metode String, tentukan nama metode. Untuk properti String, tentukan nama properti setelah "get_".
Untuk item yang memiliki beberapa string, metode string atau properti berjalan pada setiap string.
Contoh berikut menunjukkan cara menggunakan fungsi item string ini.
<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
-->
Fungsi item intrinsik
Tabel di bawah ini mencantumkan fungsi intrinsik yang tersedia untuk item.
Fungsi | Contoh | Deskripsi |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Mengembalikan sekumpulan item baru dengan jalur relatif tertentu yang ditambahkan ke semua item input. |
Count |
@(MyItems->Count()) |
Mengembalikan jumlah item. |
DirectoryName |
@(MyItems->DirectoryName()) |
Mengembalikan nilai yang setara dengan Path.DirectoryName untuk setiap item. |
Distinct |
@(MyItems->Distinct()) |
Mengembalikan item yang memiliki nilai Include berbeda. Metadata diabaikan. Perbandingan ini tidak membedakan antara huruf besar dan huruf kecil. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Mengembalikan item yang memiliki nilai itemspec berbeda. Metadata diabaikan. Perbandingan ini memperhatikan penggunaan huruf besar dan kecil. |
Exists |
@(MyItems->Exists()) |
Memfilter sekumpulan item ke item yang benar-benar ada di disk. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Diberikan sekumpulan item, akan mengembalikan item yang mewakili semua direktori leluhur. Tidak ada pesanan yang dijamin. |
Reverse |
@(MyItems->Reverse()) |
Mengembalikan item dalam urutan terbalik. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Mengembalikan boolean untuk menunjukkan apakah item memiliki nama dan nilai metadata yang diberikan. Perbandingan tidak sensitif terhadap huruf besar-kecil. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Mengembalikan item dengan metadata yang telah dibersihkan. Hanya itemspec yang dipertahankan. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Mengembalikan item yang memiliki nama metadata yang diberikan. Perbandingan tidak sensitif terhadap huruf besar/kecil. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Mengembalikan nilai metadata yang memiliki nama metadata. Item yang dikembalikan memiliki metadata yang sama dengan nilai sumber. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Mengembalikan item yang memiliki nama dan nilai metadata yang diberikan. Perbandingannya tidak peka huruf besar/kecil. |
Nota
Exists
juga dapat digunakan dalam konteks lain; dalam kondisi MSBuild, misalnya Condition="Exists('path')"
; atau dalam fungsi properti statis , misalnya $([System.IO.File]::Exists("path"))
.
Contoh berikut menunjukkan cara menggunakan fungsi item intrinsik.
<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
-->
Memanggil metode String
Jika fungsi item tidak tersedia yang cocok dengan skenario Anda, Anda dapat mencapai efek serupa dengan membuat objek string dari metadata menggunakan fungsi properti new
, dan memanggil metode String
apa pun di dalamnya. Misalnya, kode berikut menggunakan pencarian substring untuk memfilter daftar item dalam target.
<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>
Mendeteksi duplikat saat menggunakan fungsi item Metadata
Fungsi item Metadata
mempertahankan metadata asli item sumber. Ini memiliki beberapa implikasi ketika mempertimbangkan apakah item yang dikembalikan adalah duplikat atau tidak. Untuk mengontrol bagaimana item duplikat ditangani, Anda dapat menggunakan atribut KeepDuplicates. Anda juga dapat menghapus metadata, jika tidak diperlukan, dengan menambahkan RemoveMetadata , dalam hal ini hanya nilai itu sendiri yang dipertimbangkan saat mendeteksi duplikat.
<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>
Outputnya adalah sebagai berikut:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
Perubahan berikut pada kode menghasilkan nilai item duplikat yang berhasil dideteksi dan dihapus:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
Fungsi kondisi MSBuild
Fungsi HasTrailingSlash
bukan fungsi item. Ini tersedia untuk digunakan dengan atribut Condition
. Lihat kondisi MSBuild .
Konten terkait
Anda juga dapat menggunakan atribut untuk melakukan operasi pada daftar item, seperti pemfilteran pada metadata item. Untuk informasi selengkapnya, lihat item .