Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 蚂蚁依赖与蚂蚁呼叫_Java_Ant_Build Process_Build Automation - Fatal编程技术网

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" />
调用target
d
现在将调用targets
b
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>