Как заставить конечную цель муравья выполняться независимо от зависимостей - PullRequest
4 голосов
/ 06 декабря 2011

У меня есть базовый скрипт ant, в котором я копирую набор файлов в каталог вне какой-либо цели.Затем я хотел бы очистить эти файлы после выполнения любой / всех целей независимо от зависимостей.Основная проблема, с которой я столкнулся, заключается в том, что цель может быть 'compile' или 'deploywar', поэтому я не могу просто слепо вызывать цель 'cleanUp' из 'compile', потому что 'deploywar' может вызываться следующим.И я не могу слепо звонить только из «deploywar», потому что он может не быть вызван.Как я могу определить цель, которая будет вызвана после того, как все другие необходимые цели были выполнены (неудачные или успешные)?Цель 'cleanUpLib' ниже - это цель, которую я хотел бы вызвать после выполнения всех / любых задач:

<project name="proto" basedir=".." default="deploywar">
...
<copy todir="${web.dir}/WEB-INF/lib">
    <fileset dir="${web.dir}/WEB-INF/lib/common"/>
</copy>
<target name="compile">
    <!-- Uses ${web.dir}/WEB-INF/lib -->
    ....
</target>

<target name="clean" description="Clean output directories">
    <!-- Does not use ${web.dir}/WEB-INF/lib -->
    ....
</target>

<target name="deploywar" depends="compile">
    <!-- Uses ${web.dir}/WEB-INF/lib -->
    ....
</target>

<target name="cleanUpLib">
    <!-- Clean up temporary lib files. -->
    <delete>
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
    </delete>
</target>

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Решение для слушателя сборки, на которое указывает Ребсе, выглядит полезным (+1).

Альтернативой, которую вы могли бы рассмотреть, было бы «перегрузить» ваши цели, что-то вроде этого:

<project default="compile">

    <target name="compile" depends="-compile, cleanUpLib" 
        description="compile and cleanup"/>

    <target name="-compile">
        <!-- 
            your original compile target 
        -->
    </target>

    <target name="deploywar" depends="-deploywar, cleanUpLib" 
        description="deploywar and cleanup"/>

    <target name="-deploywar">
        <!-- 
            your original deploywar target
        -->
    </target>

    <target name="cleanUpLib">
    </target>

</project>

Конечно, нельзя перегрузить один файл сборки Ant, поэтому имена целей должны отличаться.

(я использовал префикс "-" выше, который является хаком, чтобы сделать цели "частными" - т.е. вы не можете вызывать их из командной строки из-за обработки аргументов сценария оболочки. Но, конечно, вы все равно можете удвоить -выберите их успешно в Ant).

2 голосов
/ 06 декабря 2011

Чтобы запустить цель после любой / всех целей, независимо от зависимостей, вы можете использовать слушатель сборки или какой-нибудь шаблон try / catch / finally, подробнее см.

...