在包含的ant文件中使用“antcall”

时间:2013-05-31 09:27:25

标签: ant

我有一个共享的ant脚本b.ant,内部使用antcall。它计算客户端脚本使用的属性。我使用include而不是import客户端脚本来避免无意中覆盖目标,但是这给了我一个antcall的问题。

使用include b中的所有目标都是前缀时,depends中的b属性会相应更新。然而,antcall并非如此。 是否有办法解决此问题,即让antcall始终调用“本地”蚂蚁目标?

我可以使用import来解决这个问题,但之后我会遇到所有覆盖问题。无法使用depends代替antcall。


示例文件

我有两个文件:

a.ant

  <project>
    <include file="b.ant" as="b" />
    <target name="test-depends" depends="b.depend">
      <echo>${calculated-property}</echo>
    </target>
    <target name="test-call" depends="b.call">
      <echo>${calculated-property}</echo>
    </target>
  </project>

b.ant

<project>
  <target name="depend" depends="some-target">
    <property name="calculated-property" value="Hello World"/>
  </target>
  <target name="call">
    <antcall target="some-target" inheritrefs="true"/>
    <property name="calculated-property" value="Hello World"/>
  </target>
  <target name="some-target"/>
</project>

示例输出

调用test-depend按预期工作,但test-call因此输出失败:

b.call:

BUILD FAILED
D:\ws\rambo2\ws-dobshl\ant-test\b.ant:6: The following error occurred while executing this line:
Target "some-target" does not exist in the project "null". 

Total time: 258 milliseconds

2 个答案:

答案 0 :(得分:2)

Ant是一种依赖矩阵规范语言。通常,一堆<antcall/><ant/><include/><import/>是编写得不好的构建脚本的标志。这是一个试图迫使Ant像编程语言一样行动的开发人员。

对于开发人员来说,将程序分解为更小的文件是有意义的。甚至Python和Perl脚本也可以从中受益。但是,分解Ant构建脚本通常会导致问题。我们有一个开发人员经历了每个项目,并将所有build.xml文件分解为六个或七个单独的构建文件,以便改进该过程。它基本上打破了整个Ant依赖机制。为了解决这个问题,他随后抛出了一堆<ant/>次来电和<include>次任务。最后,这意味着每个目标被召唤12到20次。

不使用<import/><antcall/>并不是一项严格的规定。但是,我多年来一直在使用Ant,很少使用这些机制。当我这样做时,它通常用于多个项目将使用的共享构建文件(听起来就像你拥有的那样)但是我没有在共享构建文件中定义目标,而是定义了宏。这消除了您所遇到的目标命名空间问题,并且宏更好地工作,因为它们更像Ant任务。在Ant 1.8中引入<local/>时尤其如此。

查看是否可以使用<macrodef/>而不是目标将共享构建文件重新构建。这将使包含共享构建文件变得更加容易。

答案 1 :(得分:0)

向b.ant中的name提供<project>,然后更改target的{​​{1}}:

<antcall>

<project name="b"> <!-- Give the project a name --> <target name="depend" depends="some-target"> <property name="calculated-property" value="In b.depend"/> </target> <target name="call"> <!-- Specify the name of the project containing the target --> <antcall target="b.some-target" inheritrefs="true"/> <property name="calculated-property" value="In b.call"/> </target> <target name="some-target"/> </project> 的结果:

ant -f a.ant test-call

通过更改b.ant,可以通过删除b.call: b.some-target: test-call: [echo] In b.call BUILD SUCCESSFUL 属性简化a.ant中的<include>

as