for descargar java ant build-process build-automation

java - descargar - la hormiga depende contra la llamada



building apache ant (5)

Al definir pasos de compilación secuencial, utilizo el atributo depends del elemento de target . Recientemente, he visto un archivo ant, donde la secuencia de compilación se definió por elementos antcall dentro de los objetivos. Para ilustrar :

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

vs

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

¿Hay una diferencia real entre los dos enfoques? Es uno de ellos preferible?


Antcall se usa relativamente poco, porque:

Los objetivos llamados se ejecutan en un nuevo proyecto; Tenga en cuenta que esto significa que las propiedades, referencias, etc., establecidas por los objetivos llamados no persistirán en el proyecto que realiza la llamada.

En otras palabras, antcall es un nuevo proceso Ant aislado en ejecución.


La mayor diferencia es que Ant se asegurará de que las dependencias declaradas a través de depends sean llamadas a lo sumo una vez. Por ejemplo:

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

Si llamo al objetivo d , se llaman b y c . Sin embargo, a solo se llama una vez (aunque tanto c dependen de él).

Ahora supongamos que decidimos usar antcall lugar de depends para el objetivo d :

<target name="d"> <antcall target="b" /> <antcall target="c" /> </target>

Llamar al objetivo d ahora llamará a los objetivos c ; sin embargo, se llamará a target a dos veces, una para b y luego otra para c .

En otras palabras, antcall elude las reglas de dependencia normales que son la piedra angular de Ant.

No creo que antcall deba usarse como un sustituto de las dependencias normales parecidas a Ant; eso es de lo que depends es para. Entonces, ¿cuándo lo usarías? La tarea antcall le permite controlar qué propiedades y referencias se definen (razón por la cual se crea un nuevo entorno Ant y por qué es tan lento) para que pueda usarse para crear variantes de la misma cosa; por ejemplo, tal vez dos jarras, una con y otra sin símbolos de depuración.

Sin embargo, el antcall excesivo de antcall crea secuencias de comandos de construcción lentas, quebradizas y difíciles de mantener. Piense en ello como el goto de Ant: es malvado. La mayoría de los scripts de compilación bien escritos simplemente no lo necesitan excepto en casos inusuales.


La principal diferencia entre ambos enfoques es que los objetivos en depends siempre se ejecutan, mientras que los objetivos en antcall se ejecutan solo si el objetivo que lo contiene es.

Un ejemplo clarificador:

<target name="a" depends="b" if="some.flag"> </target>

Aquí, b siempre se ejecutará, mientras que a se ejecutará solo si se define some.flag .

<target name="a" if="some.flag"> <antcall target="b" /> </target>

Aquí, b solo se ejecutará si a es, es decir, si se define some.flag .


antcall es el GOTO de hormiga. Es terrible. Es una gran manera de hacer un nido de ratas de un cruto inmanejable. Junto a ant-contrib, es la mejor manera de oler un archivo de hormiga difícil de mantener y demasiado complicado. (incluso una buena antífila es áspera)

Si tus dependencias están configuradas correctamente, deberías poder ejecutar cualquier objetivo hasta ese punto con éxito, a diferencia del patrón anticaída.

Otra razón por la que nadie ha tocado es visualmente, la capacidad de generar un gráfico de las dependencias de tu objetivo es bastante dulce si se trata de una compilación complicada. Si usas antcall estás jodido.

Desearía que @Vladimir Dyuzhev estuviera en lo cierto al decir que la antitaurica rara vez se usa, he estado en muchas tiendas donde es la norma.


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

Esto significa antes de ejecutar cualquier instrucción o cualquier etiqueta del objetivo a, ANT asegura que el objetivo b se ejecuta con éxito

Y puede llamar a cualquier objetivo utilizando antcall después de que se ejecuten algunas sentencias o etiquetas desde el destino de la llamada.