首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在包含的ant文件中使用"antcall“

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

Stack Overflow用户
提问于 2013-05-31 09:27:24
回答 2查看 2K关注 0票数 0

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

在使用include时,b中的所有目标都是前缀,而b中的depends属性也会相应更新。然而,对于antcall来说则不是这样。有什么方法可以解决这个问题吗?让antcall 总是调用“本地”ant目标吗?

我可以通过使用import来解决这个问题,但是接下来我会得到所有的覆盖问题。不可能使用depends而不是antcall。

示例文件

我有两份文件:

a.ant

代码语言:javascript
复制
  <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

代码语言:javascript
复制
<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对此输出失败:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-31 14:16:18

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-05-31 15:20:51

name分配给b.ant中的<project>,然后更改<antcall>target

代码语言:javascript
复制
<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的结果

代码语言:javascript
复制
b.call:

b.some-target:

test-call:
     [echo] In b.call

BUILD SUCCESSFUL

通过对b.ant的更改,可以通过删除as属性来简化a.ant中的as

代码语言:javascript
复制
<include file="b.ant" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16854065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档