在包含的 ant 文件中使用 "antcall"



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

使用include时,b中的所有目标都是前缀,b中的depends属性相应更新。然而,对于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:wsrambo2ws-dobshlant-testb.ant:6: The following error occurred while executing this line:
Target "some-target" does not exist in the project "null". 
Total time: 258 milliseconds

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/>而不是目标。

给b.ant中的<project>一个name,然后改变<antcall>target:

<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.call:
b.some-target:
test-call:
     [echo] In b.call
BUILD SUCCESSFUL

通过更改b.t ant,可以通过删除as属性来简化a.t ant中的<include>:

<include file="b.ant" />

相关内容

  • 没有找到相关文章

最新更新