Подтвердить что ты не робот

Ant зависит от antcall

При определении шагов последовательной сборки я использую атрибут depends элемента target. Я недавно видел файл ant, где последовательность сборки была определена элементами antcall внутри целей. Чтобы проиллюстрировать:

<target name="a" depends="b">
...</target>

против

<target name="a">
<antcall target="b"/>
...</target>

Существует ли реальная разница между этими двумя подходами? Является ли один из них предпочтительным?

4b9b3361

Ответ 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 после того, как некоторые операторы или теги будут выполняться от вызова цели.