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只调用一次(即使两者b并c依赖于它).
现在假设我们决定使用antcall而不是依赖于目标d:
<target name="d">
<antcall target="b" />
<antcall target="c" />
</target>
Run Code Online (Sandbox Code Playgroud)
呼叫目标d现在将呼叫目标b和c; 然而,目标a将被调用两次,一次b,然后再次调用c.
换句话说,antcall回避作为Ant基石的正常依赖规则.
我认为不antcall应该用它来代替普通的类似Ant的依赖; 这depends是为了什么.所以你什么时候使用它?该antcall任务允许您控制定义了哪些属性和引用(这就是创建新Ant环境的原因 - 以及为什么它如此慢),因此它可以用于创建相同内容的变体; 例如,可能是两个罐子,一个罐子,一个没有调试符号.
antcall但是,过度使用会产生缓慢,脆弱且难以维护的构建脚本.把它想象成goto蚂蚁 - 它是邪恶的.除非在特殊情况下,大多数编写良好的构建脚本根本不需要它.
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已定义.
Vla*_*hev 15
Antcall相对较少使用,因为:
被调用的目标在新项目中运行; 请注意,这意味着被调用目标设置的属性,引用等不会保留回调用项目.
换句话说,antcall是全新的隔离Ant进程运行.
antcall是蚂蚁的GOTO.这很糟糕.这是制作无法维护的老鼠窝的好方法.在ant-contrib旁边,它是闻到过于复杂难以维护的ant文件的最佳方式.(即使是一个好的antfile也很粗糙)
如果正确设置了依赖项,那么与antcall模式不同,您应该能够成功运行任何目标.
没人触及的另一个原因是vizant,如果它是一个复杂的构建,生成目标依赖关系图的能力是非常好的.如果你使用antcall你就搞砸了.
我希望@Vladimir Dyuzhev是正确的,很少使用antcall - 我去过很多商店,这是常态.
| 归档时间: |
|
| 查看次数: |
22380 次 |
| 最近记录: |