1

我有一个顶级的蚂蚁项目和它下面的许多子项目。

./build.xml
./datamodel_src/src/build.xml
./datamodel_src/src/module1/build.xml
./datamodel_src/src/module2/build.xml
./infrastructure_src/src/build.xml
./interfaces_src/src/build.xml

每个子项目,我都想强制执行一个通用的输出目录结构。项目将有一个工作区,每个子项目下都有自己的工作区。每个子项目都应在子项目的工作区下创建其工件(lib、文档、类等)。

所以输出会是这样的

c:/sandbox/mainprojectworkarea/subprojectworkarea/lib
c:/sandbox/mainprojectworkarea/subprojectworkarea/docs
c:/sandbox/mainprojectworkarea/subprojectworkarea/classes

目前我这样做如下。

顶层 build.xml 如下所示

<project name="toplevelproject" default="compile" basedir=".">
    <target name="compile">
        <ant dir="infrastructure_src/src" />
        <ant dir="interfaces_src/src " /> <!--does not work-->
        <ant dir="datamodel_src/src inhertAll=false" /> <!--works-->
    </target>
</project>

common.xml 如下所示

<property environment="env" />
<property name="project.sandbox" value="${env.BUILD_HOME}/sandbox" />
<property name="sandbox"  value="${project.sandbox}" />
<property name="pwa"  value="${sandbox}/pwa" />
<property name="wa"  value="${pwa}/${ant.project.name}" />
<property name="build"  value="${wa}/build" />
<property name="lib"  value="${wa}/lib" />
<property name="docs"  value="${wa}/docs" />
<property name="exports"  value="${wa}/exports" />

这被“包含”到所有项目中。例如“datamodel_src/src/build.xml”如下

<!DOCTYPE project [
       <!ENTITY common SYSTEM "../../common.xml">
]>

<project name="dmodel" default="compile" basedir=".">
    &common;
    <target name="compile">
        <echo  message="will create lib  in  ${lib}"/>
        <echo  message="will create docs  in  ${docs}"/>
        <ant dir="module1" inheritAll="false"/> <!--works fine-->
        <ant dir="module2" /> <!--does not work -->
    </target>   
</project>

这在我为ant调用设置 inhertiAll=false 时有效。

有没有更好更正确的方法?

扩大凯文对这个问题的回答。使用 import common.xml 成为一个真正的项目,如下所示

<project name="toplevelproject" default="compile" basedir=".">
    <property name="toplevel" value="settotrue"/>
    <target name="compile">
        <ant dir="infrastructure_src/src" />
        <ant dir="interfaces_src/src" />
        <ant dir="datamodel_src/src" />
    </target>
</project>

“datamodel_src/src/build.xml”现在有些想法如下。

<project name="dmodel" default="compile" basedir=".">
    <import file="../../common.xml" />
    <target name="compile">
        <echo  message="will create classes in  ${build}"/>
        <echo  message="will create lib  in  ${lib}"/>
        <ant dir="module1" inheritAll="false"/> <!--works fine-->
        <ant dir="module2" /> <!--does not work -->
    </target>
</project>

导入提供了具有共同目标等的选项,因此我会选择它。

4

1 回答 1

1

我正在使用导入而不是包含来做类似的事情。我所有的公共目标和属性都在一个公共构建文件中定义,每个子项目只导入公共文件。导入文件时,该文件中定义的属性将与导入文件相关。

所以我会尝试做以下事情:

  1. 将您的编译目标从您的子项目构建文件移动到您的 common.xml。

  2. 将您的 common.xml 导入每个子项目 build.xml。

于 2011-02-19T09:02:16.760 回答