蚂蚁取决于蚂蚁与蚂蚁

2022-08-31 20:41:25

在定义顺序构建步骤时,我使用元素的属性。我最近看到了一个 ant 文件,其中构建序列由目标内部的元素定义。举个例子:dependstargetantcall

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

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

这两种方法之间有真正的区别吗?其中一个更可取吗?


答案 1

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

<target name="a" />

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

<target name="c" depends="a" />

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

如果我调用 target ,并且被调用。但是,只调用一次(即使两者都依赖于它)。dbcabc

现在假设我们决定使用而不是依赖目标:antcalld

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

调用目标现在将调用目标和 ;但是,目标将被调用两次,一次用于,然后再次用于 。dbcabc

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

我不认为应该被用作正常蚂蚁式依赖关系的替代品;这就是目的。那么你什么时候会使用它呢?该任务确实允许您控制定义哪些属性和引用(这就是创建新的Ant环境的原因 - 以及为什么它如此缓慢),因此它可用于创建相同事物的变体;例如,可能是两个jar,一个带有调试符号,一个没有调试符号。antcalldependsantcall

但是,过度使用会产生缓慢、脆弱且难以维护的构建脚本。把它想象成蚂蚁——它是邪恶的。大多数写得好的构建脚本根本不需要它,除非在特殊情况下。antcallgoto


答案 2

这两种方法之间的主要区别在于,始终执行 中的目标,而 中的目标仅在包含目标时才执行。dependsantcall

一个澄清的例子:

<target name="a" depends="b" if="some.flag">

</target>

在这里,将始终执行,而仅在定义时才执行。basome.flag

<target name="a" if="some.flag">
    <antcall target="b" />
</target>

在这里,将仅在 is 时执行,即 if 被定义。basome.flag


推荐