2012-02-18 9 views
4

私は次のようにapache antを使用しています:入れ子サブプロパティのオーバーライド動作の回避策(1.8.0以降)

私はプロジェクトP1、P2、P3を持っています。これらのプロジェクトにはモジュールがあり、P2にM1、M2などがあるとしましょう。 すべてのプロジェクトには独自のAntビルドスクリプトがあり、すべてが事前定義されたターゲット(ビルド、distなど)を実装する必要があります。呼び出されたときに定義されるプロパティ。 (build.dir.base)

モジュールは同様の構造に従うので、すべてのモジュールは事前定義されたターゲットセットを実装する独自のビルドファイルを持ち、いくつかのプロパティを設定する必要があります。 (言うbuild.dir.baseてみましょう - プロジェクトの場合と同じ)

は、私はまた、世界的なアリのすべてのプロジェクトをビルドするスクリプト(またはサブセット)を持つようになり、コードで

ビルドall.xml:

<project name="x"> 
    <property name="build.dir.base" location="system.build.base" /> 
    <target name="build"> 
     <echo message="build.dir.base as defined for build-all.xml=${build.dir.base}" /> 
     <subant antfile="build.xml" target="build" inheritAll="false" inheritRefs="false"> 
      <dirset dir="${system.base}" includes="${project-list}" /> 
      <property name="build.dir.base" location="${build.dir.base}" /> 
     </subant> 
    </target> 
</project> 

のbuild.xml(モジュールと、プロジェクトごとに1、ないsubantをプロジェクトは、モジュールを持っていない場合):

<project name="y"> 
    <property name="build.dir" location="${basedir}/build" /> 
    <target name="build"> 
     <echo message="build.dir.base as defined for project=${build.dir.base}" /> 
     <subant antfile="build.xml" target="build" inheritAll="false" inheritRefs="false"> 
      <dirset dir="project.base" includes="${module-list}" /> 
      <property name="build.dir.base" location="${build.dir.base}/${name}" /> 
     </subant> 
    </target> 
</project> 
のbuild.xml(モジュール用):

<project name="z"> 
    <property name="build.dir.base" location="build.dir.base" /> 
     <target name="build"> 
      <echo message="build.dir.base as defined for module=${build.dir.base}" /> 
     </target> 
</project> 

この構造は、プロジェクトを独立に構築することができ、また、モジュールは独立して構築することができますまたはシステム全体を構築することができます

とモジュールを持っているプロジェクトのためbuild-all.xmlを使用します。

  • $ {system.build.base}/P1、
  • $ {system.build.base}/P2/M1
  • $ {システム はまた、最終生成物はfolowing構造を有しています。 build.base}/P2/M2

など

しかし、アリ> = 1.8.0ので、これはもはや不可能です。その理由は、build-all.xmlの <property name="build.dir.base" location="${basedir}/build" />がbuild.xmlの<property name="build.dir.base" location="${build.dir.base}/${name}" />(プロジェクトのビルド)よりも優先されるためです。だから、「サブモジュール」は${system.build.base}/M1代わりの${system.build.base}/P2/M1

これであるプロジェクトの目的地は、両親のいくつかはまた、そのプロパティを定義した場合subantのプロパティをオーバーライドする方法はありませんProperties defined on the command line cannot be overridden by nested elements. Since Ant 1.8.0. the same is true for nested structures of tasks: if a build file A invokes B via an task setting a property with a nested element and B contains an tasks invoking C, C will see the value set in A, even if B used a nested element as well.

を説明しています。ビルドは、親が何らかの無関係の理由で使用したプロパティを認識している必要があるため、厳しいです。

この互換性のない動作の問題を回避する方法はありますか?私のビルドシステムは、<subant inheritAll="false" inheritRefs="false">がサブビルドを汚染することなくexecを実行するという事実に大きく依存しています。

答えて

1

https://issues.apache.org/bugzilla/show_bug.cgi?id=49891もこの質問に関連すると思われます。

不必要なプロパティを除外してリセットする手法を含めてさまざまなことを試した後、サブタスクのコマンドラインプロパティをオーバーライドすることは不可能であると私は結論づけました。

+0

私は何年もの間アリを使用していますが、これは私からの手掛かりです。私はそれの理由を見るために蟻のコードを見ていないが、これを行うことは、より複雑な設定でそれを使用し、その後、単一のプロジェクト "hello world"を使用することを不可能にする。 apache.orgがそれを維持したい場合、より深刻なメンテナがアリを引き継ぐことを願っています –

1

ない完全な答えが、私はあなたのような何かを行うことによって、サブタスクによって継承されることから特定のプロパティを防ぐことができます見つけた:

<resources id='aoeu'> 
    <intersect> 
     <propertyset> 
      <propertyref builtin="commandline"/> 
     </propertyset> 
     <propertyset negate="true"> 
      <propertyref name="property.not.to.be.inherited"/> 
     </propertyset> 
    </intersect> 
</resources> 
<groovy> 
    ant.propertyset(id:"snth") { 
     project.references["aoeu"].each { 
      propertyref(name:"${it.name}") 
     } 
    } 
</groovy> 
<subant buildpathref="buildpath"> 
    <propertyset> 
     <propertyset refid="snth"/> 
    </propertyset> 
    <target name="zvwm"/> 
</subant> 
0

不可能ではありません! scriptdef self.getProject()。setInheritedProperty(key、value)を使用してプロパティを上書きできます。チェックアウトAPI

+0

あなたはそれをテストしましたか? – acutesoftware

+0

@acutesoftwareはい私はしました。私はプロジェクトのサブメンバーとモジュールプロジェクトの複雑な要件を持っていました。私はscriptdefを使用してコマンドラインプロパティを継承するサブタントコールを停止しました。 – JavaMan