2011-06-15 17 views
9

Antcontrib'in foreach görevi için paralel olarak ayarlandığında, başarısız olma yolunda bir yol bulamayacağımı gösteren aşağıdaki ant komut dosyasına sahibim. Herhangi bir fikir?antcontrib foreach, paralel olarak yürütülemiyor hataları yükseltmiyor

<project name="asdf" > 
    <taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
     <classpath> 
      <pathelement location="../lib/ant/ant-contrib-1.0b3.jar" /> 
     </classpath> 
    </taskdef> 
    <target name="build"> 
     <foreach target="exex-subant" param="foreach.dir" parallel="true" maxthreads="4" inheritall="true" list="1,2,3"> 
      <param name="target" value="build" /> 
     </foreach> 
    </target> 

    <target name="exex-subant"> 
     <fail>test</fail> 
    </target> 
</project> 

cevap

9

paralel olarak çalıştırıldığında, <foreach><parallel> görevi kullanır, ancak "failonany" özelliğini ayarlayın veya herhangi yineleme başarısız olursa görev başarısız gerektiğini söylemek herhangi bir şekilde vermez çünkü oluşur.

Neyse ki, yerine <for> kullanmak için nispeten kolay bir çözüm vardır. Örnekte, bu şekilde görünecektir: Açıkça sonra ${foreach.dir} olarak exex-subant hedefin erişilebilir olacaktır foreach.dir özelliği, geçmek zorunda

<target name="build"> 
    <for param="foreach.dir" parallel="true" list="1,2,3"> 
     <sequential> 
      <antcall target="exex-subant" inheritall="true"> 
       <param name="target" value="build" /> 
       <param name="foreach.dir" value="@{foreach.dir}" /> 
      </antcall> 
     </sequential> 
    </for> 
</target> 

Not.

Bu, tüm yinelemeleri paralel olarak yürütür, ancak bunlardan herhangi biri başarısız olursa komut başarısız olur (görev için herhangi bir şeyi yürütmez). for görevi kullanmak için, sen 1.6 karınca veya daha yüksek gerekir ve sizin taskdef değiştirmeniz gerekecektir

Not:

<taskdef resource="net/sf/antcontrib/antlib.xml"> 
    <classpath> 
     <pathelement location="../lib/ant/ant-contrib-1.0b3.jar" /> 
    </classpath> 
</taskdef> 

bir nedenle eski sürümlerini desteklemek için gerekirse

karınca, daha sonra exex-subant hedefini biraz değiştirmelisiniz, böylece başarısız olduğunda bir şey değişti. Örneğin, exex-subant içinde mevcut mantığı bir try/catch içinde sarabilirsiniz ve catch bloğunda bir dosya yaratabilirsiniz. Daha sonra foreach sona erdikten sonra, dosyanın var olup olmadığını kontrol edebilir ve eğer yapmazsa yapıyı kaybedebilirsiniz. Bu şekilde, eğer foreach'ın herhangi bir icraatı başarısız olursa, karınca betiği foreach bitiminden sonra başarısız olur.

Bu özellik, exex-subant'ta bir özelliği yalnızca başarısızlık durumunda ayarlayamayacağınızı unutmayın, çünkü özellik foreach döngüsüne geri dönmeyecektir (bu yüzden bir dosya oluşturmayı önerdim). Ama sadece for görevini kullanmanızı ve 1.6 veya daha yüksek bir anten gerektirmeyi şiddetle tavsiye ediyorum.

+0

teşekkürler ... işe yaradı! – Clintm