只有在条件为真的情况下,我才会调用目标backup.yes。Ant目标调用
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
<antcall target="update.backup"/>
有没有办法做到这一点。
只有在条件为真的情况下,我才会调用目标backup.yes。Ant目标调用
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
<antcall target="update.backup"/>
有没有办法做到这一点。
你可以做以下
其他目标:
<antcall target="update.back">
<param name="ok" value="${directory.found.yes}"/>
</antcall>
而在update.backup目标:
<target name="update.backup" if="ok">
但我认为你也可以使用ant-contrib的if statement执行以下操作:
<if>
<equals arg1="${directory.found.yes}" arg2="true" />
<then>
<antcall target="update.back" />
</then>
</if>
相反的<antcall/>
,请执行下列操作:
想象一下你调用目标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次之间,并且有超过二十个目标。我重写了整个版本s <antcall/>
,并使用真正的依赖设置,将构建时间减少了75%。
根据我的经验,<antcall/>
的90%是由于目标依赖管理较差。
假设您要执行目标foo
。 (用户想要真正执行的目标),并且在调用foo
之前,您需要执行备份,但前提是该目录实际存在。
在上面,foo
被调用。这取决于update.backaup
。目标update.backup
被调用,但它取决于update.backup.test
这将测试目录是否实际存在。
如果该目录存在,则update.backup
任务中的if
子句为true,并且该任务将实际执行。否则,如果该目录不存在,它将不会执行。
注意update.backup
首先调用之前它会检查该target
实体if
或unless
参数属性是否被选中的任何相关。这允许目标在尝试执行之前调用一个测试。
这不仅仅是一个副作用,而是内置于Ant的设计中。事实上,蚂蚁手册上的目标(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属性只启用或禁用目标他们所附的。它们不控制目标是否依赖于条件目标执行。事实上,他们甚至在目标即将被执行之前都不会被评估,并且其所有前任都已经运行。
+1 antcall应该不惜一切代价避免 - 打开一个新的项目范围,打破流程(取决于被调用目标的对象也会被调用..),属性不会被传递回调用目标。这是邪恶的根源,维护这样的脚本是PITA。最后antcall不再需要ant> = 1.6 =>使用macrodef来代替。 – Rebse 2013-04-08 21:29:21
你可以扩大一点吗?它可以完成,但是你的问题并不清楚 - 你在问题中提到'backup.yes',但不在示例代码中。 – 2013-04-08 11:29:09