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

Bu listede yineleyen ve bir şeyler yapan bir görevi nasıl yaparım?msBuild dizisi yineleme

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

Eğer myresult içinde belirli bir metin varsa, bir hata mesajı almak istiyorum. Ancak hayatım boyunca, Msbuild'deki dizilerde nasıl yineleyebileceğimi anlayamıyorum ... bunu nasıl başaracağını bilen var mı?

cevap

17

Böyle, bir iç hedefe batching kullanabilirsiniz:

<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

Bunun için istifleme kullanmak gerekir. Toplu iş, bir meta veri anahtarına dayalı olarak bir öğe kümesi üzerinde yinelenecektir. Bu konuda bir grup malzemeyi http://sedotech.com/Resources#batching'da bir araya getirdim. Örneğin, bu basit MSBuild dosyasına bir göz atın.

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

Eğer Demo sonuçlarını hedef inşa

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

Beton daima sözdizimi %(Xyz.Abc) kullanır vardır. Ne zaman bilmek istediğini, daha sonra batching hakkında daha fazla bilgi için bu bağlantıları derinlemesine bir göz atın.

+0

Öğe grubunun ilk öğelerini nasıl alabilirim? [0] 've' First() 'i çeşitli yollarla denedim ama işe yaramaya gelemedim. –