2010-06-15 2 views
15
<ItemGroup> 
    <!-- Unit Test Projects--> 
    <MyGroup Include="Hello.xml" /> 
    <MyGroup Include="GoodBye.xml" />  
</ItemGroup> 

Как выполнить задачу, которая выполняет итерацию через этот список и что-то делает?msbuild array итерация

<XmlPeek XmlInputPath="%(MyGroup.Identity)" 
     Query="/results"> 
    <Output TaskParameter="Result" 
      ItemName="myResult" /> 
</XmlPeek> 

Я хочу дать сообщение об ошибке, если myresult имеет определенный текст внутри него. Однако для жизни я не могу понять, как перебирать массивы в Msbuild ... кто-нибудь знает, как это сделать?

ответ

17

Вы можете использовать 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> 
28

Вы должны использовать группирование для этого. 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> 

При создании демонстрационной предназначаться результаты являются

Not batched: one.txt;two.txt;three.txt;four.txt 
======================================== 
Batched: one.txt 
Batched: two.txt 
Batched: three.txt 
Batched: four.txt 

Дозирование всегда использует синтаксис %(Xyz.Abc). Взгляните на эти ссылки для получения дополнительной информации о дозировании, а затем вы хотели узнать.

+0

Как получить первый элемент группы товаров? Я пробовал '[0]' и 'First()' разными способами, но я не мог заставить его работать. –

Смежные вопросы