2011-02-07 54 views
2

我有一个构建系统,其中许多组件完全相同,所以我一直在更改它以在大多数构建任务的常用文件上使用“导入”。然后,构建系统还需要构建它所依赖的任何模块。所以我粗略地...在Ant中嵌套导入

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

在common.xml中有一个名为'build'的目标。我希望project2能够包含project1并使用扩展点来放置对构建目标的依赖。但由于某种原因,它不承认project1有构建目标。如果我将其更改为依赖于project1.xml中定义的目标,那就没问题。但我需要能够指定common.xml中的目标。

有没有办法做到这一点?

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

因此,我创建一些简单的文件来说明我的问题。

<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构建文件中,并且正确地构建它。现在唯一的问题是,如果我取消上面的mid注释来定义自己的构建步骤,它会被导入覆盖并被忽略。所以它最终变成[build,common.build]而不是[build,mid.build]。

回答

2

尝试使用include task代替,特别是在mid.xml水平:

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

的“包括”和“进口”的任务有其他方法来压倒一切的任务。请参阅'<如何导入>不同于<包括>?'include task docs

短的版本:采用进口,如果你 打算覆盖的目标,否则 使用包括

这听起来像你想被挑共同“打造”的目标除非在中期定义。问题在于,使用'import'任务时,读入(即common.xml)版本将覆盖mid.xml中的版本。因为“包括”不容许超驰,当读common.xml在呼叫方(mid.xml)中定义的一个并不覆盖。

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

build: 

mid.build: 
    [echo] build common 

随着build目标覆盖在mid.xml:

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

结果变为:

build: 

mid.build: 
    [echo] build mid