2012-02-18 37 views
4

我使用Apache Ant以下列方式:解決方法嵌套subant特性替代行爲(自1.8.0)

我有項目P1,P2,P3。其中一些項目有模塊,比方說P2有M1,M2等。 所有項目都有自己的ant構建腳本,並且他們都必須實現一組預定義的目標(build,dist等),腳本需要一些屬性被調用時被定義。假設(build.dir.base)

模塊遵循相似的結構,因此每個模塊都有自己的構建文件,用於實現預定義的一組目標,並期望設置一些屬性。 (讓說build.dir.base - 相同的項目)

我也有建立所有項目的全局ant腳本(或子集)

在代碼看起來像:

集結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文件(一個用於與模塊的每一個項目,沒有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
  • $ {系統。 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

是這樣解釋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。這是非常嚴重的,因爲構建應該知道父級用於某些不相關理由的屬性。

有沒有解決這種不兼容的行爲變化的解決方法?因爲,我的構建系統很大程度上依賴於<subant inheritAll="false" inheritRefs="false">將執行exec而不污染子構建的事實。

回答

1

https://issues.apache.org/bugzilla/show_bug.cgi?id=49891似乎也涉及到這個問題。

嘗試了很多不同的東西(包括過濾掉不需要的屬性,然後將其復位的技術)之後,我得出的結論,這是不可能的任務subant覆蓋命令行屬性。

+0

雖然,我使用螞蟻多年,這是從我的交易斷路器。我還沒有考慮螞蟻代碼,看看是什麼原因呢,但是這樣做使得螞蟻不可能在更復雜的設置,然後單個項目的「Hello World」來使用它。我希望一些更嚴肅的維護者會接管螞蟻,如果apache.org想要保持它 – 2012-04-07 22:30:32

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(鍵,值)。退房API

+0

你有沒有測試過? – acutesoftware 2013-09-29 12:22:11

+0

@acutesoftware是的,我做到了。我對項目中的子項目有模塊化項目的複雜需求。我結束了使用scriptdef來停止subant調用繼承命令行屬性。 – JavaMan 2013-09-29 16:33:05