Java 蚂蚁依赖与蚂蚁呼叫
定义顺序构建步骤时,我使用Java 蚂蚁依赖与蚂蚁呼叫,java,ant,build-process,build-automation,Java,Ant,Build Process,Build Automation,定义顺序构建步骤时,我使用target元素的dependens属性。我最近看到了一个ant文件,其中构建序列由目标中的antcall元素定义。 举例说明: <target name="a" depends="b"> ...</target> ... vs ... 这两种方法之间真的有区别吗?其中之一更可取吗?Antcall相对很少使用,因为: 被调用的目标以新的方式运行 项目请注意,这意味着 由设置的属性、引用等 调用的目标不会保留回来 到调用项目 换句话说,a
target
元素的dependens
属性。我最近看到了一个ant文件,其中构建序列由目标中的antcall
元素定义。
举例说明:
<target name="a" depends="b">
...</target>
...
vs
...
这两种方法之间真的有区别吗?其中之一更可取吗?Antcall相对很少使用,因为: 被调用的目标以新的方式运行 项目请注意,这意味着 由设置的属性、引用等 调用的目标不会保留回来 到调用项目
换句话说,antcall是全新的独立Ant进程运行。这两种方法的主要区别在于总是执行
depends
中的目标,而antcall
中的目标只有在包含目标的情况下才执行
一个澄清的例子:
<target name="a" depends="b" if="some.flag">
</target>
这里,b
仅在a
为时执行,即定义了some.flag
。。。。
<target name="a" if="some.flag">
<antcall target="b" />
</target>
<target name="a" depends="b"> ...</target>
这意味着在从目标a执行任何语句或标记之前,ANT会确保成功执行目标b
在调用target执行某些语句或标记之后,您可以使用antcall调用任何目标。最大的区别在于Ant将确保通过
dependens
声明的依赖项最多被调用一次。例如:
<target name="a" />
<target name="b" depends="a" />
<target name="c" depends="a" />
<target name="d" depends="b, c" />
调用targetd
现在将调用targetsb
和c
;但是,目标a
将被调用两次,一次调用b
,然后再次调用c
换句话说,antcall
避开了作为Ant基石的正常依赖规则
我认为不应该用antcall
来代替正常的类似蚂蚁的依赖关系;这就是的作用。那你什么时候用?antcall
任务确实允许您控制定义了哪些属性和引用(这就是为什么要创建一个新的Ant环境——以及为什么它这么慢的原因),以便可以使用它来创建同一事物的变体;e、 例如,可能有两个罐子,一个有调试符号,一个没有调试符号
但是,过度使用antcall会导致生成脚本速度慢、脆弱且难以维护。把它想象成蚂蚁的下一步——它是邪恶的。大多数编写良好的构建脚本都不需要它,除非是在特殊情况下。antcall是ant的目标。太可怕了。这是一个用无法维护的垃圾搭建老鼠窝的好方法。除了ant contrib之外,这是发现过于复杂、难以维护的ant文件的最佳方法。(即使是好的锉刀也是粗糙的)
如果您的依赖项设置正确,您应该能够成功地运行任何目标到该点,这与antcall模式不同
没有人提到的另一个原因是vizant,如果它是一个复杂的构建,那么生成目标依赖关系图的能力是非常好的。如果你使用antcall,你就完蛋了
我希望@Vladimir Dyuzhev是正确的,antcall很少被使用-我去过很多商店,在那里它是正常的。这是否也意味着antcall的任务并行运行?不,antcall是同步的,就像其他任务一样。Ant中有一个并发执行的任务。当我查看文档时,我看到这样的引用:“默认情况下,当前项目的所有属性都将在新项目中可用。或者,您可以将inheritAll属性设置为false,并且只设置“user”属性(即在命令行上传递的属性)将传递给新项目。“。这与您所说的有所不同。谢谢,一个高度相关的细节我曾经使用antcall来设置“参数化”的目标,我可以重复使用,但是很久以前在1.6中添加的macrodef为这种重复使用提供了更好的理由。+1对于关于不同口味的罐子的评论。我能够让我的run once部分运行,并且通过将run once部分在层次结构中向上移动来生成不同的风格,这样它就不会被antcall部分或它们的依赖项调用。antcall是一种非常方便的方法,可以将重复的步骤提取到单独的任务中,并使用不同的参数调用它。如果vizant不能支持antcall,这是vizant的问题,唉,不是。绝对不是。ant中的程序流是通过依赖完成的,antcall调用同一build.xml是一件令人讨厌的事情。如果您需要多次使用不同的输入执行类似的操作,那么最好使用ant宏。此外,ant中的属性与vizant不同,Grand()会显示来自的依赖项。使用antcall的脚本是PITA:-(在2003年ant 1.6引入macrodef之后,没有理由再使用antcall了!为了补充这一点,可以使用
多次调用目标,而如果所有对目标的引用都是通过依赖项完成的,则最多只能执行一次。依赖项
并不总是执行。导入t从gradle编写脚本,并从gradle调用主目标。在这种情况下,不会执行该主目标的依赖项
。唯一需要antcall的时间是当您从ant迁移到gradle并从gradle调用ant目标时。在这种情况下,ant构建文件可能不会执行依赖项目标,在这种情况下,您将需要d使用antcall
。
<target name="a" />
<target name="b" depends="a" />
<target name="c" depends="a" />
<target name="d" depends="b, c" />
<target name="d">
<antcall target="b" />
<antcall target="c" />
</target>