Ant зависит от antcall
При определении шагов последовательной сборки я использую атрибут depends
элемента target
. Я недавно видел файл ant, где последовательность сборки была определена элементами antcall
внутри целей.
Чтобы проиллюстрировать:
<target name="a" depends="b">
...</target>
против
<target name="a">
<antcall target="b"/>
...</target>
Существует ли реальная разница между этими двумя подходами? Является ли один из них предпочтительным?
Ответы
Ответ 1
Основное различие между обоими подходами заключается в том, что цели в depends
всегда выполняются, а цели в antcall
выполняются только в том случае, если содержит целевую цель.
Пример пояснения:
<target name="a" depends="b" if="some.flag">
</target>
Здесь b
всегда будет выполняться, а a
будет выполняться только в том случае, если определено some.flag
.
<target name="a" if="some.flag">
<antcall target="b" />
</target>
Здесь b
будет выполняться, только если a
, т.е. если some.flag
определено.
Ответ 2
Самое большое различие заключается в том, что Ant гарантирует, что зависимости, объявленные через depends
, вызываются не более одного раза. Например:
<target name="a" />
<target name="b" depends="a" />
<target name="c" depends="a" />
<target name="d" depends="b, c" />
Если я вызываю target d
, вызываются b
и c
. Однако a
вызывается только один раз (хотя оба b
и c
зависят от него).
Теперь предположим, что мы решили использовать antcall
вместо зависимости для цели d
:
<target name="d">
<antcall target="b" />
<antcall target="c" />
</target>
Вызов целевой d
теперь будет вызывать цели b
и c
; однако цель a
будет вызываться дважды, один раз для b
, а затем снова для c
.
Другими словами, antcall
обходит правила нормальной зависимости, которые являются краеугольным камнем Ant.
Я не думаю, что antcall
следует использовать в качестве замены для нормальных зависимостей Ant; что для depends
. Итак, когда вы его используете? Задача antcall
позволяет вам контролировать, какие свойства и ссылки определены (поэтому создается новая среда Ant - и почему она настолько медленная), поэтому ее можно использовать для создания вариантов одной и той же вещи; например, может быть две банки, одна с одной и одна без символов отладки.
Использование antcall
, однако, создает медленные, хрупкие и жесткие сценарии сборки. Подумайте об этом как о goto
of Ant - это зло. Большинство хорошо написанных скриптов сборки просто не нужны, кроме как в необычных случаях.
Ответ 3
Antcall относительно редко используется, потому что:
Вызываемая цель запускается в новом проект; имейте в виду, что это означает свойства, ссылки и т.д., установленные так называемые цели не будут сохраняться к вызывающему проекту.
Другими словами, antcall - это полностью новый изолированный процесс Ant.
Ответ 4
antcall - это GOTO ant. Это ужасно. Это отличный способ сделать крыс гнездом непосильной рывки. Рядом с ant -contrib это лучший способ почувствовать чрезмерно сложный процесс хранения файла ant. (даже хороший antfile груб)
Если ваш параметр установлен правильно, вы должны успешно выполнить любую цель до этой точки, в отличие от шаблона antcall.
Другая причина, по которой никто не затронул, - это vizant, способность генерировать график ваших целевых зависимостей довольно сладка, если это сложная сборка. Если вы используете antcall, вы ввернуты.
Я хочу, чтобы @Владимир Дмитриевич был прав, что antcall редко используется - я был во многих магазинах, где это норма.
Ответ 5
<target name="a" depends="b"> ...</target>
Это означает, что перед выполнением какого-либо оператора или любого тега из цели a, ANT гарантирует, что цель b успешно выполнена
И вы можете вызывать любую цель с помощью antcall после того, как некоторые операторы или теги будут выполняться от вызова цели.