ant依赖与antcall

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

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

VS

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

这两种方法有真正的区别吗? 他们中的一个更可取吗?

这两种方法的主要区别在于, depends中的目标总是被执行,而antcall中的目标只有在包含目标的情况下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只会在b被执行的时候执行,也就是说如果定义了some.flag

最大的区别是,Ant将确保通过depends声明的depends 最多被调用一次。 例如:

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

如果我打电话给目标d ,则会调用bc 。 然而, a只被调用一次(尽pipebc依赖于它)。

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

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

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

换句话说, antcall避开了作为Ant基础的正常依赖规则。

我不认为antcall应该被用来替代正常的类Ant依赖; 这是depends于的。 那么你什么时候使用它? antcall任务确实允许你控制定义的属性和引用(这就是为什么创build一个新的Ant环境 – 为什么这么慢),所以它可以用来创build同一事物的变种; 例如,也许有两个jar子,一个jar子和一个没有debugging符号。

但是antcall会造成缓慢,脆弱和难以维护的构build脚本。 把它想成ant的屁股 – 它是邪恶的。 除非在不常见的情况下,大多数写得很好的构build脚本根本就不需要它。

Antcall相对较less使用,因为:

被叫目标在新项目中运行; 请注意,这意味着由被调用目标设置的属性,引用等不会持续到调用项目。

换句话说,antcall是全新的孤立的Ant进程运行。

antcall是ant的GOTO。 这很糟糕。 这是一个很好的方法来做一个不可维护的老鼠窝。 在ant-contrib旁边,这是嗅觉过度复杂难以维护的ant文件的最好方法。 (即使是一个好的antfile是粗糙的)

如果您的依赖设置正确,您应该能够成功运行任何目标,不像antcall模式。

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

我希望@Vladimir Dyuzhev是正确的,antcall很less使用 – 我去过很多商店,这是常态。

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

这意味着在执行任何语句或来自目标a的任何标签之前,ANT确保目标b被成功执行

你可以使用antcall调用任何目标之后,从调用目标执行一些语句或标签。