0

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

当使用include所有目标时b都是前缀,并且depends属性b会相应更新。然而,对于antcall. 有没有办法处理这个问题,即antcall总是调用“本地”蚂蚁目标?

我可以通过使用来解决这个import问题,但是我会遇到所有覆盖问题。不能用它来depends代替 antcall。


示例文件

我有两个文件:

蚂蚁

  <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
4

2 回答 2

2

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

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

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

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

于 2013-05-31T14:16:18.863 回答
1

给b.ant中name<project>a ,然后更改:target<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.call:

b.some-target:

test-call:
     [echo] In b.call

BUILD SUCCESSFUL

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

<include file="b.ant" />
于 2013-05-31T15:20:51.713 回答