antcontrib foreach, выполняемый параллельно, не вызывает ошибок - PullRequest
9 голосов
/ 16 июня 2011

У меня есть следующий муравейный скрипт, который я не могу найти способ сделать сбой, когда для параметра Parallels установлено значение true для задачи foreach antcontrib. Есть идеи?

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

1 Ответ

9 голосов
/ 24 июня 2011

Это происходит потому, что при параллельном выполнении <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).

Обратите внимание, что для использования *Задача 1015 *, вам понадобится 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 немного, так что она изменила что-то, когда потерпела неудачу.Например, вы можете обернуть текущую логику в exex-subant внутри try / catch, а в блоке catch она может создать файл.Затем, после завершения foreach, вы можете проверить, существует ли этот файл, и в противном случае выполнить сборку.Таким образом, если какое-либо выполнение foreach завершится неудачно, сценарий ant завершится неудачно после завершения foreach.

Обратите внимание, что вы не можете просто установить свойство в exex-subant при сбое, так как свойство не будетраспространяться обратно в цикл foreach (вот почему я предложил создать файл).Но я настоятельно рекомендую просто использовать задачу for и требовать муравей 1.6 или выше.

...