Ant: Как проверить, существует ли цель (и не называть ее, если ее нет)? - PullRequest
5 голосов
/ 26 мая 2011

У меня есть набор файлов сборки, некоторые из которых вызывают другие - сначала импортируют их.Сборки в конце строки могут иметь или не иметь конкретную цель (например, «copyother»).Я хочу вызвать его из основного файла сборки, если эта цель определена в сценарии сборки конца строки.Как я могу это сделать?

Часть вызывающего скрипта:

<!-- Import project-specific libraries and classpath -->
<property name="build.dir" value="${projectDir}/build"/>
<import file="${build.dir}/build_libs.xml"/>

...

<!-- "copyother" is a foreign target, imported in build_libs.xml per project -->
<target name="pre-package" depends="    clean,
                                        init,
                                        compile-src,
                                        copy-src-resources,
                                        copy-app-resources,
                                        copyother,
                                        compile-tests,
                                        run-junit-tests"/>

Я не хочу, чтобы в каждом проекте определялась цель "copyother".Как я могу сделать условный вызов муравья?

Ответы [ 3 ]

3 голосов
/ 27 мая 2011

Я предполагаю, что вы не импортируете "другие" сценарии сборки в свой основной build.xml. (Потому что это не сработает. Ant рассматривает импорт как локальный.)

В то же время вы используете зависимость, а не вызов ant / ant, поэтому, возможно, вы импортируете их, но по одному.

Ты не можешь делать то, что хочешь в родном муравье. Как вы заметили, тестирование файла - это легко, а цель - нет. Особенно, если этот другой проект еще не загружен. Вы определенно должны написать пользовательскую задачу Ant, чтобы выполнить то, что вы хотите. Два проспекта:

1) Вызовите project.getTargets () и посмотрите, есть ли ваша цель. Это включает в себя рефакторинг вашего скрипта, чтобы использовать ant / antcall вместо чистого, но это не похоже на хак. Написание пользовательского условия Java не сложно, и в руководстве по Ant есть пример.

2) Добавить цель в текущий проект, если ее там еще нет. Новая цель будет неактивной. [не уверен, что этот подход работает]

1 голос
/ 02 декабря 2013

Для той же полноты.Другой подход заключается в том, чтобы иметь какую-то цель для проверки цели.

Этот подход обсуждается здесь: http://ant.1045680.n5.nabble.com/Checking-if-a-Target-Exists-td4960861.html (пост vimil).Проверка выполняется с помощью scriptdef.Так что это не сильно отличается от другого ответа (Жанна Боярски), но сценарий легко добавить.

<scriptdef name="hastarget" language="javascript">
    <attribute name="targetname"/>
    <attribute name="property"/>
    <![CDATA[
       var targetname = attributes.get("property");
       if(project.getTargets().containsKey(targetname)) {
            project.setProperty(attributes.get("property"), "true");
       }
     ]]>
</scriptdef>

<target name="check-and-call-exports">
    <hastarget targetname="exports" property="is-export-defined"/>
    <if>
        <isset property="is-export-defined"/>
        <then>
            <antcall target="exports"   if="is-export-defined"/>
        </then>
    </if>
</target>

<target name="target-that-may-run-exports-if-available" depends="check-and-call-exports">
0 голосов
/ 29 июля 2011

Вам следует изучить использование условия typefound, добавленного к ANT в 1.7. Вы можете использовать его, например, с задачей if из antcontrib следующим образом, но вы должны проверить макродеф, а не задачу, из-за того, как она работает:

<if>
   <typefound name="some-macrodef"/>
<then>
   <some-macrodef/>
   </then>
</if>

При этом ant-файлы, имеющие макроопределение с именем «some-macro-or-taskdef», будут вызывать его, а другие ant-файлы без него не получат ошибку.

...