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
,则会调用b
和c
。 然而, a
只被调用一次(尽pipeb
和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
任务确实允许你控制定义的属性和引用(这就是为什么创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调用任何目标之后,从调用目标执行一些语句或标签。