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

Comment faire une tâche qui itère dans cette liste et qui fait quelque chose?msbuild array itération

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

Je souhaite afficher un message d'erreur si myresult contient un certain texte. Cependant, pour la vie de moi, je ne peux pas comprendre comment itérer à travers les tableaux dans Msbuild ... quelqu'un sait comment accomplir cela?

Répondre

17

Vous pouvez utiliser batching sur une cible intérieure, comme ça:

<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

Vous devez utiliser dosant pour cela. Le traitement par lot parcourra un ensemble d'éléments en fonction d'une clé de métadonnées. J'ai rassemblé tout un tas de documents à ce sujet au http://sedotech.com/Resources#batching. Par exemple, jetez un oeil à ce fichier MSBuild simple.

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

Lorsque vous construisez la démo cible les résultats sont

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

Batching utilise toujours la syntaxe %(Xyz.Abc). Jetez un oeil à ces liens pour plus d'informations sur le traitement par lots, alors vous avez toujours voulu savoir.

+0

Comment obtenir le premier élément d'un groupe d'articles? J'ai essayé '[0]' et 'First()' de différentes manières mais je n'ai pas réussi à le faire fonctionner. –