1

トップレベルのantプロジェクトとその下にある多くのサブプロジェクトがあります。

./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、docs、classesなど)を作成する必要があります。

したがって、出力は次のようになります

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 に答える