Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行执行的antcontrib foreach不会引发错误_Ant_Foreach_Ant Contrib - Fatal编程技术网

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

并行执行的antcontrib foreach不会引发错误,ant,foreach,ant-contrib,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-c

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

测试

发生这种情况是因为当并行执行时,
使用任务,但没有设置“failonany”属性,也没有给出任何方式来说明如果任何迭代失败,任务应该失败

幸运的是,有一个相对简单的解决方法,即使用
而不是
。在您的示例中,看起来是这样的:

<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>
如果出于某种原因,您需要支持旧版本的ant,那么您必须稍微更改exex subant目标,以便在失败时更改某些内容。例如,您可以将exex subant中的当前逻辑封装在try/catch中,并在catch块中创建一个文件。然后,在foreach终止后,您可以检查该文件是否存在,如果存在,则使构建失败。这样,如果foreach的任何执行失败,ant脚本将在foreach完成后失败

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

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