Cli*_*ntm 9 ant foreach ant-contrib
我有以下ant脚本,当对于antcontrib的foreach任务将parallel设置为true时,我似乎找不到失败的方法.有任何想法吗?
<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>
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为并行执行时,<foreach>使用<parallel>任务,但不设置"failonany"属性,或者在任何迭代失败时给出任何方式说任务应该失败.
幸运的是,有一个相对简单的解决方法,即使用<for>而不是<foreach>.在您的示例中,这将是这样的:
<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>
Run Code Online (Sandbox Code Playgroud)
请注意,您必须显式传入foreach.dir属性,然后可以在exex-subant目标中访问该属性${foreach.dir}.
这将并行执行所有迭代,但如果其中任何一个失败,脚本将失败(它不会执行除for任务之外的任何操作).
请注意,为了使用该for任务,您需要ant 1.6或更高版本,并且需要将您的taskdef更改为:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="../lib/ant/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因你需要支持旧版本的ant,那么你必须稍微更改exex-subant目标,以便在失败时改变它.例如,您可以将当前逻辑包装在try/catch中的exex-subant中,并且在catch块中它可以创建一个文件.然后在foreach终止之后,您可以检查该文件是否存在,如果存在则无法进行构建.这样,如果foreach的任何执行失败,则antach脚本将在foreach完成后失败.
请注意,您不能只在失败时在exex-subant中设置属性,因为该属性不会传播回foreach循环(这就是我建议创建文件的原因).但我强烈建议只使用for任务并要求ant 1.6或更高版本.
| 归档时间: |
|
| 查看次数: |
5734 次 |
| 最近记录: |