Работа с функциями элементов

Код в задачах и целевых объектах может вызывать функции элементов для получения сведений об элементах в проекте (MSBuild версии 4.0 или более поздних). Эти функции упрощают получение элементов distinct и выполняются быстрее, чем перебор элементов.

Строковые функции элементов

Строковые методы и свойства в .NET Framework можно использовать для обработки любого значения элемента. Для методов String укажите имя метода. Для свойств String укажите имя свойства после "get_".

В элементах, имеющих несколько строк, строковый метод или строковое свойство выполняются для каждой строки.

Следующий пример показывает, как использовать строковые функции элементов.

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

Встроенные функции элементов

В следующей таблице перечислены доступные для элементов встроенные функции.

Функция Пример Description
Combine @(MyItems->Combine('path')) Возвращает новый набор элементов, в котором ко всем входным элементам добавляется указанный относительный путь.
Count @(MyItems->Count()) Возвращает количество элементов.
DirectoryName @(MyItems->DirectoryName()) Возвращает эквивалент Path.DirectoryName для каждого элемента.
Distinct @(MyItems->Distinct()) Возвращает элементы, имеющие уникальные значения Include. Метаданные игнорируются. При сравнении регистр не учитывается.
DistinctWithCase @(MyItems->DistinctWithCase()) Возвращает элементы, имеющие уникальные значения itemspec. Метаданные игнорируются. При сравнении учитывается регистр.
Exists @(MyItems->Exists()) Фильтрует набор элементов, оставляя только те из них, которые реально существуют на диске.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Получает набор элементов и возвращает элементы, представляющие все их родительские каталоги. Порядок элементов не гарантируется.
Reverse @(MyItems->Reverse()) Возвращает элементы в обратном порядке.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) Возвращает boolean, чтобы указать, имеет ли какой-либо элемент заданное имя и значение метаданных. При сравнении регистр не учитывается.
ClearMetadata @(MyItems->ClearMetadata()) Возвращает элементы с очищенными метаданными. Сохраняется только itemspec.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Возвращает элементы, для которых указано имя метаданных. При сравнении регистр не учитывается.
Metadata @(MyItems->Metadata("MetadataName")) Возвращает значения метаданных, имеющие имя метаданных. Возвращаемые элементы имеют те же метаданные, что и исходные значения.
WithMetadataValue @(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) Возвращает элементы, для которых указано имя и значение метаданных. При сравнении регистр не учитывается.

Примечание.

Также Exists может использоваться в других контекстах: в условиях MSBuild (например, Condition="Exists('path')") или в функциях статических свойств (например, $([System.IO.File]::Exists("path"))).

Следующий пример показывает, как использовать встроенные функции элементов.

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

Обнаружение дубликатов при использовании функции элемента метаданных

Функция Metadata элемента сохраняет исходные метаданные исходных элементов. Это имеет некоторые последствия при рассмотрении того, являются ли возвращенные элементы дубликатами или нет. Чтобы управлять обработкой повторяющихся элементов, можно использовать атрибут KeepDuplicates. Вы также можете удалить метаданные, если он не нужен, добавив метаданные RemoveMetadata, в этом случае при обнаружении дубликатов учитываются только те значения.

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

Вывод выглядит следующим образом.

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

Следующее изменение кода приводит к успешному обнаружению и удалению повторяющегося значения элемента:

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

Функции условий MSBuild

Функция HasTrailingSlash не является функцией элемента. Ее можно использовать с атрибутом Condition. См. Условия MSBuild.

Вы также можете использовать атрибуты для выполнения операций со списками элементов, например фильтрация по метаданным элемента. Дополнительные сведения см. в разделе Элементы.