我想调用 target backup.yes 仅当条件为真时。
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
<antcall target="update.backup"/>
有没有办法做到这一点。
我想调用 target backup.yes 仅当条件为真时。
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
<antcall target="update.backup"/>
有没有办法做到这一点。
而不是<antcall/>
,请执行以下操作:
想象一下,您正在调用 target foo
,并且您想在之前进行备份,但前提是该条件存在:
<target name="foo"
depends="update.backup">
<..../>
</target>
<target name="update.backup.test">
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
</target>
<target name="update.backup"
depends="update.backup.test"
if="directory.found.yes">
<.../>
</target>
问题<antcall/>
在于它在 Ant 使用的依赖矩阵被破坏时使用,它用于强制在另一个任务完成之前完成一个任务。当真正被滥用时,你最终会多次调用同一个任务。我在这里有一个项目,它实际上将每个目标调用了 10 到 14 次,并且有超过两打目标。我重写了整个构建<antcall/>
,并通过使用真正的依赖设置,将构建时间减少了 75%。
根据我的经验,90%<antcall/>
是由于目标依赖管理不善造成的。
假设您要执行 target foo
。(用户想要真正执行的目标),并且在foo
调用之前,您想要进行备份,但前提是该目录实际存在。
在上面,foo
被称为。这取决于update.backaup
. 目标update.backup
被调用,但这取决于update.backup.test
哪个将测试目录是否实际存在。
如果目录存在,则任务if
上的子句update.backup
为真,任务将实际执行。否则,如果目录不存在,它将不会执行。
请注意,update.backup
首先调用任何依赖项,然后再检查是否检查了实体的if
orunless
参数上的属性。target
这允许目标在尝试执行之前调用测试。
这不仅仅是副作用,而是内置于 Ant 的设计中。事实上,Ant Manual on Targets]( http://ant.apache.org/manual/targets.html ) 专门给出了一个非常相似的例子:
<target name="myTarget" depends="myTarget.check" if="myTarget.run">
<echo>Files foo.txt and bar.txt are present.</echo>
</target>
<target name="myTarget.check">
<condition property="myTarget.run">
<and>
<available file="foo.txt"/>
<available file="bar.txt"/>
</and>
</condition>
</target>
并指出:
重要: if 和 unless 属性仅启用或禁用它们所附加的目标。它们不控制条件目标所依赖的目标是否被执行。事实上,在目标即将执行之前,它们甚至都不会被评估,并且它的所有前辈都已经运行。
您可以执行以下操作
在另一个目标中:
<antcall target="update.back">
<param name="ok" value="${directory.found.yes}"/>
</antcall>
在 update.backup 目标中:
<target name="update.backup" if="ok">
但我认为您也可以使用 ant-contrib 的if语句执行以下操作:
<if>
<equals arg1="${directory.found.yes}" arg2="true" />
<then>
<antcall target="update.back" />
</then>
</if>