Aracılığıyla paylaş


Öğe işlevleriyle çalışmak

Görevler ve hedeflerdeki kodlar, projedeki öğeler hakkında bilgi almak için öğe işlevlerini çağırabilir (MSBuild 4.0 ve sonraki sürümlerde). Bu işlevler, benzersiz öğeler elde etmeyi basitleştirir ve öğelerin üzerinden tek tek geçmekten daha hızlıdır.

Dize öğesi işlevleri

Herhangi bir öğe değeri üzerinde çalışmak için .NET Framework'teki dize yöntemlerini ve özelliklerini kullanabilirsiniz. String yöntemleri için yöntem adını belirtin. String özellikleri için "get_" den sonra özellik adını belirtin.

Birden çok dizeye sahip öğeler için dize yöntemi veya özelliği her dizede çalışır.

Aşağıdaki örnekte bu dize öğesi işlevlerinin nasıl kullanılacağı gösterilmektedir.

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

İç öğe işlevleri

Aşağıdaki tabloda öğeler için kullanılabilen iç işlevler listelenmiştir.

Fonksiyon Örnek Açıklama
Combine @(MyItems->Combine('path')) Tüm giriş öğelerinin sonuna belirli bir göreli yol eklenmiş yeni bir öğe kümesi döndürür.
Count @(MyItems->Count()) Öğelerin sayısını döndürür.
DirectoryName @(MyItems->DirectoryName()) Her öğe için Path.DirectoryName eşdeğerini döndürür.
Distinct @(MyItems->Distinct()) Ayrı Include değerleri olan öğeleri döndürür. Meta veriler göz ardı edilir. Karşılaştırma büyük/küçük harfe duyarlı değildir.
DistinctWithCase @(MyItems->DistinctWithCase()) Ayrı itemspec değerleri olan öğeleri döndürür. Meta veriler yoksayılır. Karşılaştırma büyük/küçük harfe duyarlıdır.
Exists @(MyItems->Exists()) Bir dizi öğeyi diskte var olan öğelere filtreler.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Bir öğe kümesi verüldüğünde, tüm üst dizinleri temsil eden öğeleri döndürür. Hiçbir sipariş garanti değildir.
Reverse @(MyItems->Reverse()) Öğeleri ters sırada döndürür.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) Herhangi bir öğenin verilen meta veri adına ve değerine sahip olup olmadığını belirtmek için bir boolean döndürür. Karşılaştırma, harflerin büyük/küçük durumuna duyarlı değildir.
ClearMetadata @(MyItems->ClearMetadata()) Meta verileri temizlenmiş öğeleri döndürür. Yalnızca itemspec korunur.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Verilen meta veri adına sahip öğeleri döndürür. Karşılaştırma büyük/küçük harfe duyarlı değildir.
Metadata @(MyItems->Metadata("MetadataName")) Meta veri adı olan meta verilerin değerlerini döndürür. Döndürülen öğeler, kaynak değerlerle aynı meta veriye sahiptir.
WithMetadataValue @(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) Verilen meta veri adına ve değerine sahip öğeleri döndürür. Karşılaştırma büyük/küçük harfe duyarlı değildir.

Not

Exists diğer bağlamlarda da kullanılabilir; MSBuild koşullarında, örneğin Condition="Exists('path')"; veya Statik özellik işlevleri, örneğin $([System.IO.File]::Exists("path")).

Aşağıdaki örnekte iç öğe işlevlerinin nasıl kullanılacağı gösterilmektedir.

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

Dize yöntemini çağırma

Senaryonuzla eşleşen bir öğe işlevi kullanılamıyorsa, new özellik işlevini kullanarak meta verilerden bir dize nesnesi oluşturarak ve üzerinde herhangi bir String yöntemini çağırarak benzer bir etki elde edebilirsiniz. Örneğin, aşağıdaki kod bir hedefteki öğe listesini filtrelemek için bir alt dize araması kullanır.

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

Meta Veri öğesi işlevini kullanırken yinelenenleri algılama

Metadata öğesi işlevi, kaynak öğelerin özgün meta verilerini korur. Döndürülen öğelerin yinelenen olup olmadığı dikkate alınırken bunun bazı etkileri vardır. Yinelenen öğelerin nasıl işleneceğini denetlemek için KeepDuplicates özniteliğini kullanabilirsiniz. Ayrıca, gerekli değilse RemoveMetadata ekleyerek meta verileri kaldırabilirsiniz. Bu durumda yinelenenleri algılarken yalnızca değerlerin kendileri dikkate alınır.

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

Çıkış aşağıdaki gibidir:

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

Kodda yapılan aşağıdaki değişiklik, yinelenen öğe değerinin başarıyla algılanıp kaldırılmasına neden olur:

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

MSBuild koşul işlevleri

İşlev HasTrailingSlash bir öğe işlevi değildir. Condition özniteliğiyle kullanılabilir. Bkz. MSBuild koşulları.

Öğe listelerinde öğe meta verilerini filtreleme gibi işlemler gerçekleştirmek için öznitelikleri de kullanabilirsiniz. Daha fazla bilgi için bkz. Öğeler.