我对Ant很陌生,但是我已经体验过创建通用蚂蚁目标的非常好的模式,这些目标将通过带有不同参数的antcall任务来调用。
我的例子是编译目标,它使用复杂的构建命令编译多个系统,这对于每个系统来说有点不同。通过使用上述模式,可能无法为该编译命令创建复制粘贴代码。
我的问题是,我不知道将返回值(例如编译器的返回值)传递回调用antcall任务的目标的任何方法。那么我的方法是病态的,并且根本无法从antcall任务返回值,或者你知道任何解决方法吗?
谢谢,
答案 0 :(得分:15)
使用ant-contrib jar中的antcallback而不是antcall
<target name="testCallback">
<antcallback target="capitalize2" return="myKey">
</antcallback>
<echo>a = ${myKey}</echo>
</target>
<target name="capitalize2">
<property name="myKey" value="it works"/>
</target>
输出:
testCallback:
capitalize2:
[echo] a = it works
BUILD SUCCESSFUL
答案 1 :(得分:5)
一种方法是使用“echo file = ....”或PropertyFile任务将属性写入临时文件。然后在需要的地方回读房产。 Kludge但是有效。
答案 2 :(得分:3)
Ant任务都是关于进入的东西,副作用发生了。因此,尝试在功能方面进行编程(填充内容,填充内容)会变得混乱。
那说你可以做的是每次调用生成一个属性名称,并将结果值存储在该属性中。您需要传入一个标识符,这样您才不会尝试创建相同属性的副本。像这样:
<target name="default">
<property name="key" value="world"/>
<antcall target="doSomethingElse">
<param name="param1" value="${key}"/>
</antcall>
<echo>${result-${key}}</echo>
</target>
<target name="doSomethingElse">
<property name="hello-${param1}" value="it works?"/>
</target>
但我相信更典型的方法 - 而不是antcalls--是使用宏。 http://ant.apache.org/manual/Tasks/macrodef.html
答案 3 :(得分:0)
可以在ant-contrib jar任务中使用Antcall。
答案 4 :(得分:0)
使用关键字“ depends”可以获得类似的行为。
<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="main">
<target name="main">
<antcall target="build-system-with-depends" />
<!-- wait for different results -->
<waitfor checkevery="1000" checkeveryunit="millisecond" maxwaitunit="millisecond" maxwait="2000">
<available file="dummy.not.present.file" classname="" property=""></available>
</waitfor>
<antcall target="build-system-with-depends" />
</target>
<target name="build-system-with-depends" depends="do-compiler-stuff">
<echo>$${compiler.result}=${compiler.result}</echo>
</target>
<target name="do-compiler-stuff">
<!-- simulate different return states -->
<tstamp>
<format pattern="yyyyMMddHHmmss" property="compiler.result" />
</tstamp>
</target>
</project>