将antcall目标中定义的属性传递回调用目标

时间:2011-01-13 13:07:17

标签: ant

我对Ant很陌生,但是我已经体验过创建通用蚂蚁目标的非常好的模式,这些目标将通过带有不同参数的antcall任务来调用。

我的例子是编译目标,它使用复杂的构建命令编译多个系统,这对于每个系统来说有点不同。通过使用上述模式,可能无法为该编译命令创建复制粘贴代码。

我的问题是,我不知道将返回值(例如编译器的返回值)传递回调用antcall任务的目标的任何方法。那么我的方法是病态的,并且根本无法从antcall任务返回值,或者你知道任何解决方法吗?

谢谢,

5 个答案:

答案 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>