2009-11-12 53 views
2

我想要做的是編譯爲一個文件,該文件將源文件中的常量作爲版本。無法訪問導入的ANT目標中的腳本生成的屬性

我有這樣的設置(或至少是顯著位):

任務/ compile.xml

<project name="Compile"> 
    <target name="check.version"> 
     <script language="javascript"> 
      regex = /VERSION.+?"([\d\.]+)";/; 
      r = new java.io.BufferedReader(new java.io.FileReader(new java.io.File(file))); 
      line = r.readLine(); 
      while ((line = r.readLine()) != null) { 
       m = regex.exec(line); 
       if (m) { 
        project.setProperty("project.version" , m[1]); 
        break; 
       } 
      } 
      r.close(); 
     </script> 
     <echo>${ant.project.name}-${project.version}</echo> <!-- = Fail-0.2 --> 
    </target> 
</project> 

並且build.xml:

<project name="Fail"> 
    <import file="${basedir}/build/tasks/compile.xml"/> 

    <target name="test"> 
     <antcall target="check.version"> 
      <param name="file" value="${basedir}/Source.as"/> 
     </antcall> 
     <echo>${project.version}</echo> <!-- = ${project.version} --> 
     <echoproperties></echoproperties> 
    </target> 
</project> 

所以,似乎腳本設置的屬性只在該目標中進行了本地定義,如果我在同一個項目中指定了另一個目標(「編譯」),它也不會知道該屬性。

我也嘗試在「編譯」 - 項目xml中設置一個,但它不會被目標覆蓋。

那麼我怎樣才能訪問該腳本生成的屬性?或者有另外一種方法來做這樣的事情嗎?

我真的想保留在一個單獨的XML部分,因爲它使項目構建腳本更清潔。

謝謝!

+0

另外,你是否知道任何有關螞蟻相關問題的IRC頻道(與其中的人)? – 2009-11-12 11:33:33

回答

2

如果您通過antcall呼叫另一個目標,則其中設置的屬性將不在調用者的範圍內。

如果您需要訪問另一個目標設置的屬性,則可以將該目標聲明爲依賴項,以確保它在目標之前執行。就像這樣:

<target name="test" depends="check.version"> 
    <echo>${project.version}</echo> <!-- = value set in check.version --> 
    <echoproperties></echoproperties> 
</target> 

編輯:另外還有AntCallBack的任務,可從Ant-ContribAntelope

AntCallBack是相同的 標準 'antcall' 任務,除了 它允許在調用 目標中提供在被調用的 目標中設置的屬性。

+0

非常好!但是,因爲我無法將參數傳遞給depends(或者我能嗎?),我只需查找屬性即可。謝謝! – 2009-11-12 16:52:07

+0

編輯答案以添加Ant-Contrib中的antcallback任務。 – 2009-11-12 22:52:37