Ant antcall定义属性的目标

时间:2011-03-11 16:39:23

标签: ant

在Ant中我想定义一个定义属性的目标(称为A),并从另一个目标(称为antcall)定义B。我希望在对目标B进行攻击后,目标A可以访问目标A中定义的属性。

例如:

<target name="B">
    <antcall target="A" inheritAll="true" inheritRefs="true" />
    <echo>${myprop}</echo>
</target>
<target name="A">
    <property name="myprop" value="myvalue" />
</target>

但是它不起作用且<echo>${myprop}</echo>无法打印myvalue(我认为因为myprop中未定义属性B

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:11)

根据Apache Ant FAQ

    <target name="cond" depends="cond-if"/>

    <target name="cond-if" if="prop1">
      <antcall target="cond-if-2"/>
    </target>

    <target name="cond-if-2" if="prop2">
      <antcall target="cond-if-3"/>
    </target>

    <target name="cond-if-3" unless="prop3">
      <echo message="yes"/>
    </target>

Note: <antcall> tasks do not pass property changes back up to the environment they were called from, so you wouldn't be able to, for example, set a result property in the cond-if-3 target, then do <echo message="result is ${result}"/> in the cond target.

在这方面,使用antcall做你想要的事情不可能

========== 编辑 ===========

尝试antcallback:AntCallBack与标准的'antcall'任务完全相同,只是它允许在被调用目标中设置的属性在调用目标中可用。
http://antelope.tigris.org/nonav/docs/manual/bk03ch20.html

从上页粘贴的示例代码:

    <target name="testCallback" description="Test CallBack">
        <taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack" classpath="${antelope.home}/build" />
        <antcallback target="-testcb" return="a, b"/>
        <echo>a = ${a}</echo>
        <echo>b = ${b}</echo>
    </target>

    <target name="-testcb">
        <property name="a" value="A"/>
        <property name="b" value="B"/>
    </target>

答案 1 :(得分:9)

另一种方法是将目标重构为宏。您正在尝试使用类似函数的目标,但它们并不打算以这种方式使用。我通常将我的大部分逻辑写成宏,这样我就可以更容易地将它组成更复杂的宏。然后我为我需要的命令行入口点编写简单的包装器目标。

答案 2 :(得分:5)

而不是使用<antcall>为什么不让目标B依赖目标A

<target name="B" depends="A">
    <echo>${myprop}</echo>
</target>
<target name="A">
    <property name="myprop" value="myvalue" />
</target>

答案 3 :(得分:0)

我想你想要使用一个参数。

<project default="B">
<target name="B">
    <antcall target="A">
      <param name="myprop" value="myvalue"/>
    </antcall>

</target>
<target name="A">
    <echo>${myprop}</echo>
</target>
</project>

我用一个项目标签包围了这个,并将echo语句移动到“A”中。我的输出说

B:
A:
     [echo] myvalue
BUILD SUCCESSFUL

答案 4 :(得分:0)

@ alem0lars,因为你说你想要细分一个目标,让我提供一个不同的解决方案(遗憾的是,它没有回答你原来的问题)。

<project default="mytarg">
<target name="mytarg">
  <property name="tgt" value="build"/>
  <antcall target="deps"/>
</target>
<target name="deps" depends="aTgt,bTgt"/>
<target name="aTgt">
  <echo>"In aTgt doing a ${tgt}"</echo>
</target>
<target name="bTgt">
  <echo>"In bTgt doing a ${tgt}"</echo>
</target>
</project>

这将构建细分为aTgt和bTgt。

输出

aTgt:
     [echo] "In aTgt doing a build"
bTgt:
     [echo] "In bTgt doing a build"
deps:
BUILD SUCCESSFUL