Работа с функциями элементов
Код в задачах и целевых объектах может вызывать функции элементов для получения сведений о элементах проекта (в MSBuild 4.0 и более поздних версиях). Эти функции упрощают получение отдельных элементов и быстрее, чем циклирование элементов.
Функции строковых элементов
Для работы с любым значением элемента можно использовать строковые методы и свойства в .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
-->
Встроенные функции элементов
В таблице ниже перечислены встроенные функции, доступные для элементов.
Функция | Пример | Описание |
---|---|---|
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
-->
Вызов метода String
Если функция элемента недоступна, которая соответствует вашему сценарию, можно добиться аналогичного эффекта, создав строковый объект из метаданных с помощью функции свойства new
и вызовите любой метод String
в нем. Например, следующий код использует поиск подстроки для фильтрации списка элементов в целевом объекте.
<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>
Обнаружение дубликатов при использовании функции элемента метаданных
Функция элемента 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.
Связанное содержимое
Вы также можете использовать атрибуты для выполнения операций со списками элементов, например фильтрация по метаданным элемента. Дополнительные сведения см. в разделе Элементы.