Ant中的嵌套导入

时间:2011-02-07 14:43:08

标签: ant import

我有一个构建系统,其中许多组件完全相同,所以我一直在将其更改为在大多数构建任务的公共文件上使用'import'。然后构建系统还需要构建它依赖的任何模块。所以我粗略地......

common.xml
project1.xml
  - import common.xml
project2.xml
  - include project1.xml
  - import common.xml

common.xml中有一个名为'build'的目标。我希望project2能够包含project1并使用extension-point来对构建目标进行依赖。但由于某种原因,它无法识别project1具有构建目标。如果我将其更改为依赖于project1.xml中定义的目标,那么它就没问题了。但我需要能够指定common.xml中的目标。

有没有这样做?

没有ant-contrib。该项目曾经使用过,但我试图摆脱它,所以我们没有可怕的,程序化的构建系统代码。该项目有许多依赖项,看起来像钻石和一个适当的依赖图(一个ant自动生成)将有很大帮助。

所以我创建了一些简单的文件来说明我的问题。

<project name="top" default="build">
  <include file="mid.xml" as="mid" />
  <target name="build">
    <antcall target="mid.build" />
  </target>
</project>

<project name="mid" default="build">
  <!-- <target name="build"> -->
  <!--   <echo message="build mid" /> -->
  <!-- </target> -->
  <import file="common.xml" />
</project>

<project name="common">
  <target name="build">
    <echo message="build common" />
  </target>
</project>

这失败了。 top.xml找不到mid.build。当我运行ant -p列出目标时,它会显示build和common.build。所以我尝试添加到mid.xml构建文件,我得到它正确构建。现在唯一的问题是,如果我取消注释上面的XML以定义自己的构建步骤,它将被导入覆盖并被忽略。所以它最终成为[build,common.build]而不是[build,mid.build]。

1 个答案:

答案 0 :(得分:2)

请尝试使用include task,尤其是mid.xml

<project name="mid" default="build">
  <include file="common.xml" />
</project>

“包含”和“导入”任务具有替代任务覆盖的方法。请参阅'如何&lt; import&gt;与include task docs中的&lt; include&gt;?'不同:

  

简短版本:如果您使用导入   打算覆盖目标,否则   使用include

听起来您希望拾取共同的“构建”目标,除非它在中间定义。问题是,使用'import'任务时,read-in(即common.xml)版本将覆盖mid.xml中的版本。因为'include'不允许覆盖,所以当读取common.xml时,不会覆盖调用者(mid.xml)中定义的覆盖。

示例:对于上面的mid.xml,ant -f top.xml报告:

build:

mid.build:
     [echo] build common

在mid.xml中使用build目标覆盖:

<project default="build" name="mid">
  <target name="build">
    <echo message="build mid" />
  </target>
  <include file="common.xml" />
</project>

结果变为:

build:

mid.build:
     [echo] build mid