2010-06-15 8 views
15

Wie mache ich eine Aufgabe, die durch diese Liste iteriert und etwas tut?Msbuild Array Iteration

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

Ich möchte eine Fehlermeldung an, wenn thow MyResult einen bestimmten Text innerhalb von ihm hat. Aber für das Leben von mir kann ich nicht herausfinden, wie man Arrays in Msbuild durchläuft ... weiß jemand, wie man das erreicht?

Antwort

17

Sie könnten batching auf einem inneren Ziel, so verwenden:

<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

Sie benötigen Dosierung für diesen Einsatz. Die Stapelverarbeitung wird basierend auf einem Metadatenschlüssel über eine Reihe von Elementen iterieren. Ich habe eine Menge Material dazu unter http://sedotech.com/Resources#batching zusammengestellt. Schauen Sie sich beispielsweise diese einfache MSBuild-Datei an.

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

Wenn Sie bauen die Demo, die Ergebnisse sind Ziel

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

Dosiersysteme immer verwendet die Syntax %(Xyz.Abc). Werfen Sie einen Blick auf diese Links für weitere Informationen über Batching, die Sie schon immer wissen wollten.

+0

Wie bekomme ich den ersten Artikel einer Artikelgruppe? Ich habe '[0]' und 'First()' auf verschiedene Arten versucht, aber ich konnte es nicht zum Laufen bringen. –

Verwandte Themen