Как выполнить задачу CallTarget в «цикле» с MSBuild ItemGroups?

У меня есть свойство со значениями, разделенными точкой с запятой, и я хочу вызвать цель один раз для каждого из значений.

На данный момент я проверил, и msbuild автоматически разделяется на несколько элементов в группе элементов:

<ItemGroup>
    <Version Include="$(Versions)" />
</ItemGroup>

Я хочу добиться того, чтобы другая цель вызывалась столько раз, сколько значений в этой ItemGroup. Я знаю, что должен использовать

%Version.Identity

Однако я не вижу ни одного атрибута в Задаче CallTarget, для которого это было бы возможно.

К сожалению, я не могу перенести цель, которую хочу запустить, на C # или PowerShell.

2
Matt Mcdon 13 Ноя 2017 в 19:15

1 ответ

Лучший ответ

Цель в msbuild выполняется только один раз за вызов. Если цель уже была запущена, дополнительные задачи <CallTarget> ничего не делают - так же, как когда несколько целей зависят от общей цели.

Хотя можно использовать целевую группировку путем определения специфичных для метаданных Inputs или Outputs, это действительно не работает с элементами, которые не представляют элементы на диске.

Способ выполнить ту же логику с разными входными данными - это использовать задачу <MSBuild> для выполнения «внутренней» сборки, которая выполняет несколько сборок одной и той же цели с разными параметрами:

<ItemGroup>
  <Version Include="1;2;3" />
</ItemGroup>
<MSBuild Projects="$(MSBuildProjectFile)" Targets="DoSthWithVersion" Properties="Version=%(Version.Identity)" />
…

<Target Name="DoSthWithVersion">
  <Message Importance="high" Text="Version is: $(Version)" />
</Target>

Обратите внимание, что вам также необходимо будет передать любое другое свойство, которое было сгенерировано / изменено во время сборки и не является частью определений статических свойств файла проекта (т.е. установлено только внутри цели).

2
Martin Ullrich 13 Ноя 2017 в 16:57