Bagikan melalui


Bekerja dengan fungsi item

Kode dalam tugas dan target dapat memanggil fungsi item untuk mendapatkan informasi tentang item dalam proyek (dalam MSBuild 4.0 dan yang lebih baru). Fungsi-fungsi ini menyederhanakan mendapatkan item yang berbeda dan lebih cepat daripada mengulang item.

Fungsi item string

Anda dapat menggunakan metode dan properti string 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.

Function Contoh Deskripsi
Combine @(MyItems->Combine('path')) Mengembalikan kumpulan 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. Perbandingannya tidak peka huruf besar/kecil.
DistinctWithCase @(MyItems->DistinctWithCase()) Mengembalikan item yang memiliki nilai itemspec berbeda. Metadata diabaikan. Perbandingannya peka huruf besar-kecil.
Exists @(MyItems->Exists()) Memfilter sekumpulan item ke item yang benar-benar ada di disk.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Diberikan sekumpulan item, mengembalikan item yang mewakili semua direktori ancestor. Tidak ada pesanan yang dijamin.
Reverse @(MyItems->Reverse()) Mengembalikan item dalam urutan terbalik.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) Mengembalikan boolean untuk menunjukkan apakah ada item yang memiliki nama dan nilai metadata yang diberikan. Perbandingannya tidak peka huruf besar/kecil.
ClearMetadata @(MyItems->ClearMetadata()) Mengembalikan item dengan metadatanya dibersihkan. Hanya itemspec yang dipertahankan.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Mengembalikan item yang memiliki nama metadata yang diberikan. Perbandingannya tidak peka 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.

Catatan

Exists juga dapat digunakan dalam konteks lain; dalam kondisi MSBuild, misalnya Condition="Exists('path')"; atau dalam Fungsi properti statik, 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
  -->

Mendeteksi duplikat saat menggunakan fungsi item Metadata

Fungsi Metadata item 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 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.

Anda juga dapat menggunakan atribut untuk melakukan operasi pada daftar item, seperti pemfilteran pada metadata item. Untuk informasi selengkapnya, lihat Item.