Иерархия массива msbuild
<ItemGroup>
<!-- Unit Test Projects-->
<MyGroup Include="Hello.xml" />
<MyGroup Include="GoodBye.xml" />
</ItemGroup>
Как выполнить задачу, которая выполняет итерацию через этот список и что-то делает?
<XmlPeek XmlInputPath="%(MyGroup.Identity)"
Query="/results">
<Output TaskParameter="Result"
ItemName="myResult" />
</XmlPeek>
Я хочу сообщить сообщение об ошибке, если myresult имеет определенный текст внутри него. Однако для жизни я не могу понять, как перебирать массивы в Msbuild... кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Вы можете использовать batching для внутренней цели, например:
<ItemGroup>
<!-- Unit Test Projects-->
<MyGroup Include="Hello.xml" />
<MyGroup Include="GoodBye.xml" />
</ItemGroup>
<Target Name="CheckAllXmlFile">
<!-- Call CheckOneXmlFile foreach file in MyGroup -->
<MSBuild Projects="$(MSBuildProjectFile)"
Properties="CurrentXmlFile=%(MyGroup.Identity)"
Targets="CheckOneXmlFile">
</MSBuild>
</Target>
<!-- This target checks the current analyzed file $(CurrentXmlFile) -->
<Target Name="CheckOneXmlFile">
<XmlPeek XmlInputPath="$(CurrentXmlFile)"
Query="/results/text()">
<Output TaskParameter="Result" ItemName="myResult" />
</XmlPeek>
<!-- Throw an error message if Result has a certain text : ERROR -->
<Error Condition="'$(Result)' == 'ERROR'"
Text="Error with results $(Result)"/>
</Target>
Ответ 2
Для этого вам нужно использовать пакетную обработку. Batching будет перебирать набор элементов на основе метаданных. Я собрал кучу материала на этом http://sedotech.com/Resources#batching. Например, посмотрите на этот простой файл MSBuild.
<Project DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Files Include="one.txt"/>
<Files Include="two.txt"/>
<Files Include="three.txt"/>
<Files Include="four.txt"/>
</ItemGroup>
<Target Name="Demo">
<Message Text="Not batched: @(Files->'%(Identity)')"/>
<Message Text="========================================"/>
<Message Text="Batched: %(Files.Identity)"/>
</Target>
</Project>
Когда вы создаете цель Demo, результаты
Not batched: one.txt;two.txt;three.txt;four.txt
========================================
Batched: one.txt
Batched: two.txt
Batched: three.txt
Batched: four.txt
Пакетирование всегда использует синтаксис %(Xyz.Abc)
. Взгляните на эти ссылки для получения дополнительной информации о пакетной обработке, которую вы когда-либо хотели знать.