我有一个构建系统,其中许多组件完全相同,所以我一直在将其更改为在大多数构建任务的公共文件上使用'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]。
答案 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