gpt4 book ai didi

并行执行的antcontrib foreach不会引发错误

转载 作者:行者123 更新时间:2023-12-04 04:00:19 24 4
gpt4 key购买 nike

我有以下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>

最佳答案

发生这种情况的原因是,在并行执行时,<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>

请注意,您必须显式传递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>

如果由于某种原因需要支持较旧版本的ant,则必须稍微更改exex-subant目标,以便它在失败时有所更改。例如,您可以将当前逻辑包装在try/catch中的exex-subant中,并在catch块中创建一个文件。然后,在foreach终止之后,您可以检查该文件是否存在,如果存在则使构建失败。这样,如果对foreach的任何执行失败,则在foreach完成后,ant脚本将失败。

请注意,您不能仅在失败时在exex-subant中设置属性,因为该属性不会传播回foreach循环(这就是我建议创建文件的原因)。但我强烈建议您仅使用 for任务,并要求使用ant 1.6或更高版本。

关于并行执行的antcontrib foreach不会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com