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

¿Cómo realizo una tarea que itera a través de esta lista y hace algo?iteración de array de msbuild

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

Quiero recibir un mensaje de error si myresult tiene un texto determinado dentro de él. Sin embargo, por mi vida no puedo entender cómo iterar a través de matrices en Msbuild ... ¿Alguien sabe cómo lograr esto?

Respuesta

17

Usted podría utilizar batching en un objetivo interno, así:

<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

Es necesario utilizar dosificación para esto. El procesamiento por lotes iterará sobre un conjunto de elementos basado en una clave de metadatos. He reunido un montón de material en esto en http://sedotech.com/Resources#batching. Por ejemplo, eche un vistazo a este simple archivo 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> 

Al generar el objetivo de demostración los resultados son

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

lotes siempre utiliza la sintaxis %(Xyz.Abc). Eche un vistazo a esos enlaces para obtener más información sobre el procesamiento por lotes que alguna vez quiso saber.

+0

¿Cómo obtengo el primer elemento de un grupo de artículos? He intentado '[0]' y 'First()' de varias maneras, pero no pude hacerlo funcionar. –