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

Làm cách nào để tạo một tác vụ lặp qua danh sách này và thực hiện điều gì đó?Lặp lại mảng msbuild

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

Tôi muốn gửi thông báo lỗi nếu myresult có một văn bản nhất định bên trong. Tuy nhiên đối với cuộc sống của tôi tôi không thể tìm ra cách để lặp qua mảng trong Msbuild ... bất cứ ai biết làm thế nào để thực hiện điều này?

Trả lời

17

Bạn có thể sử dụng batching trên một mục tiêu bên trong, như vậy:

<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

Bạn cần phải sử dụng trạm trộn cho việc này. Tính năng nhóm sẽ lặp qua một tập hợp các mục dựa trên khóa siêu dữ liệu. Tôi đã tập hợp một loạt tài liệu về điều này tại http://sedotech.com/Resources#batching. Ví dụ, hãy xem tệp MSBuild đơn giản này.

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

Khi bạn xây dựng Demo nhắm mục tiêu kết quả là

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

trộn luôn sử dụng cú pháp %(Xyz.Abc). Hãy xem kỹ các liên kết này để biết thêm thông tin về việc tạo nhóm, sau đó bạn muốn biết.

+0

Làm cách nào để có được mục đầu tiên của một nhóm mục? Tôi đã thử '[0]' và 'First()' theo nhiều cách khác nhau nhưng tôi không thể làm cho nó hoạt động được. –

Các vấn đề liên quan