9

次の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>
4

1 に答える 1

9

これは、並行して実行された場合<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スクリプトが失敗します。

プロパティはforeachループに伝播されないため、失敗時にexex-subantにプロパティを設定することはできないことに注意してください(これがファイルの作成を提案した理由です)。forただし、タスクを使用し、ant1.6以上を要求することを強くお勧めします。

于 2011-06-23T22:52:50.663 に答える