Муравей зависит от Antcall - PullRequest
46 голосов
/ 09 мая 2011

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

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

против

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

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

Ответы [ 5 ]

81 голосов
/ 09 мая 2011

Самое большое отличие состоит в том, что Ant гарантирует, что зависимости, объявленные через depends, будут называться не более одного раза. Например:

<target name="a" />

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

<target name="c" depends="a" />

<target name="d" depends="b, c" />

Если я вызываю цель 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 муравья - это зло. Большинству хорошо написанных сценариев сборки это просто не нужно, за исключением необычных случаев.

55 голосов
/ 09 мая 2011

Основное различие между обоими подходами состоит в том, что цели в 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.

14 голосов
/ 09 мая 2011

Antcall используется относительно редко, потому что:

Вызванные цели запускаются в новом проект; знать, что это означает свойства, ссылки и т. д., установленные названные цели не сохранятся в вызывающий проект.

Другими словами, antcall - это совершенно новый запущенный процесс Ant.

7 голосов
/ 10 февраля 2012

antcall - это GOTO муравья.Это ужасно.Это отличный способ сделать из крыс гнездо из неуправляемой корки.Рядом с ant-contrib это лучший способ почувствовать слишком сложный и трудно поддерживаемый файл муравья.(даже хороший муравейник грубый)

Если ваши зависимости установлены правильно, вы должны быть в состоянии успешно запустить любую цель до этой точки, в отличие от шаблона antcall.

Еще одна причина, по которой никто не трогалВажно, что возможность генерировать график ваших целевых зависимостей довольно приятна, если это сложная сборка.Если вы используете antcall, вы ввернуты.

Хотелось бы, чтобы @Dyzhim был прав, что antcall редко используется - я был во многих магазинах, где это норма.

0 голосов
/ 09 мая 2011
  <target name="a" depends="b"> ...</target> 

Это означает, что перед выполнением любого оператора или любого тега из цели a, ANT гарантирует, что цель b успешно выполнена

И вы можете вызывать любую цель, используя antcall после выполнения некоторых операторов или теговот вызывающей цели.

...