蚂蚁取决于antcall

kos*_*tja 48 java ant build-automation build-process

在定义顺序构建步骤时,我使用元素的depends属性target.我最近看到了一个ant文件,其中构建序列由antcall目标内的元素定义.为了显示 :

<target name="a" depends="b">
...</target>
Run Code Online (Sandbox Code Playgroud)

VS

<target name="a">
<antcall target="b"/>
...</target>
Run Code Online (Sandbox Code Playgroud)

这两种方法之间是否存在真正的差异?其中一个更受欢迎吗?

Ric*_*ele 82

最大的区别是Ant将确保最多depends调用一次声明的依赖项. 例如:

<target name="a" />

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

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

<target name="d" depends="b, c" />
Run Code Online (Sandbox Code Playgroud)

如果我呼叫目标d,b并被c呼叫.然而,a只调用一次(即使两者bc依赖于它).

现在假设我们决定使用antcall而不是依赖于目标d:

<target name="d">
   <antcall target="b" />
   <antcall target="c" />
</target>
Run Code Online (Sandbox Code Playgroud)

呼叫目标d现在将呼叫目标bc; 然而,目标a将被调用两次,一次b,然后再次调用c.

换句话说,antcall回避作为Ant基石的正常依赖规则.

我认为不antcall应该用它来代替普通的类似Ant的依赖; 这depends是为了什么.所以你什么时候使用它?该antcall任务允许您控制定义了哪些属性和引用(这就是创建新Ant环境的原因 - 以及为什么它如此慢),因此它可以用于创建相同内容的变体; 例如,可能是两个罐子,一个罐子,一个没有调试符号.

antcall但是,过度使用会产生缓慢,脆弱且难以维护的构建脚本.把它想象成goto蚂蚁 - 它是邪恶的.除非在特殊情况下,大多数编写良好的构建脚本根本不需要它.

  • 我曾经使用antcall来设置我可以重复使用的"参数化"目标,但是在1.6长时间内添加的macrodef为这种重用提供了更好的情况. (7认同)
  • 关于"曾经且只有一次"的好点!当然是Upvoted. (3认同)

Lau*_*eyn 57

这两种方法之间的主要区别是,在目标depends始终执行,而目标antcall只有在包含目标是执行.

一个澄清的例子:

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

</target>
Run Code Online (Sandbox Code Playgroud)

这里b将始终执行,而a只有在some.flag定义时才会执行.

<target name="a" if="some.flag">
    <antcall target="b" />
</target>
Run Code Online (Sandbox Code Playgroud)

这里b只会执行a,即if是否some.flag已定义.

  • 要添加到此目标,可以使用`<antcall>`多次调用目标,而如果所有对它们的引用都是通过依赖项完成的,则目标最多可执行一次. (2认同)

Vla*_*hev 15

Antcall相对较少使用,因为:

被调用的目标在新项目中运行; 请注意,这意味着被调用目标设置的属性,引用等不会保留回调用项目.

换句话说,antcall是全新的隔离Ant进程运行.

  • 不,antcall是同步的,就像任何其他任务一样.Ant中有一个<parallel>任务用于并发执行. (2认同)

the*_*kbb 7

antcall是蚂蚁的GOTO.这很糟糕.这是制作无法维护的老鼠窝的好方法.在ant-contrib旁边,它是闻到过于复杂难以维护的ant文件的最佳方式.(即使是一个好的antfile也很粗糙)

如果正确设置了依赖项,那么与antcall模式不同,您应该能够成功运行任何目标.

没人触及的另一个原因是vizant,如果它是一个复杂的构建,生成目标依赖关系图的能力是非常好的.如果你使用antcall你就搞砸了.

我希望@Vladimir Dyuzhev是正确的,很少使用antcall - 我去过很多商店,这是常态.

  • 没有.断然没有.ant中的程序流是用depends完成的,antcall调用相同的build.xml是一种憎恶.如果您需要使用不同的输入多次执行类似的操作,那么使用ant宏总是更好. (2认同)
  • 使用antcall的脚本是PITA :-(在2003年使用ant 1.6引入macrodef后,没有理由再使用antcall了! (2认同)