給編程狂熱者的ant task筆記

來源:互聯網
上載者:User

   作者:江南白衣

   這篇文檔是專門寫給那些編程狂熱者,在Ant裡編程時要留意的重要Task。

    不知為何,老外的各種指令碼都寫得格外漂亮。從Appfuse裡學到很多,在編寫SpringSide2.0的構件安裝指令碼時又被迫自學了不少,這裡作下總結。

    如果只說一樣最重要的事情,就是ant-contrib的<if> 和 <for>節點,使Ant 擁有了完整的編程能力。

1. 變數

   Ant裡的變數有個詭異的特性----一旦被賦值就不會改變,這個特性有時候協助很大,有時候讓人很苦惱,一定要注意。另一樣要注意的是,Ant裡的變數和其他語言的變數一樣,有可效範圍。

   1.由命令列賦值

      ant build.xml -Dtomcat.home=foo

   2.與使用者互動輸入--Input task

      <input message="請選擇一個Target "
               validargs="compile,jar,test"
               addproperty="my.input"/>

 3.從propertis檔案讀取並存檔 -- propertyfile task    

      <propertyfile file="my.properties">
              <entry key="springside.home" default="."/>
      </propertyfile>

      如果my.properties 不存在,產生my.properties檔案,springside.home=.。有一個特別有用的地方:有些properties檔案的屬性每個開發人員都不同,不想放入svn,但又想初始化數值,可以用該命令。

     <propertyfile file="my.properties">
              <entry key="springside.home" value="....."/>
      </propertyfile>

      重新寫入設定檔。

2. 流程式控制制

     如果沒有ant-contrib 貢獻的<if> 和<for>節點,Ant的可程式化性是極低極低的。

 2.1 if task

 ant原來可以在target級進行if判斷(unless,if 屬性),但實在太不方便了。

2.2 Conditions

但Ant預先封裝的一堆condition很是很方便的。這些condition完全從實際出發,包括檔案是否存在,http://localhost:8080是否連通都可以作為條件,見Ant的參考手冊。

2.3 For task

支援"a,b,c,d" 字串數組的迴圈與檔案目錄,Fileset的迴圈。

2.4 Parallel task

Parallel非常有用,比如我想一邊開tomcat,一邊做別的,就需要使用它,否則就只有用spawn=true屬性把tomcat放在後台運行。spawn有很多不好的地方,比如不能即時在console看到資訊,停止ant運行不能把tomcat關掉等。

Parallel相當於一個容器,放在裡面的每個task都會被並存執行。如果想把某幾個task順序執行,用相當於()的Sequential task 包起來。

2.5 Waitfor task

暫停ant執行直到條件符合,比如<waitfor><http url=http://localhost:8080/></waitfor>就會等待tomcat啟動後才會繼續往下執行。Macrodef task

3. 代碼封裝

 ant 代碼最基本的封裝是

 1. ant  task:調用其他指令碼的任務,可設定dir 與是否繼承本指令碼的變數。

 2. antcall task:調用本指令碼內其他task,可設定參數。

 3. import task :就像其他語言的include一樣,引入其他指令碼內容到本指令碼裡。

1. AntFetch,  AntCallBack task

   ant-contrib貢獻,對應於Ant 與 AntCall。原版只能向被調用函數傳遞變數,函數執行後沒辦法return 值。antcallback的文法如下
   <antcallback target="mytarget" return="myresult1,myresult2"/>

2. Macrodef task

   作為最小的封裝單位,與以<target>封裝再<antcall target="xxx">調用差不太遠,細微之處自行體驗了。個人比較喜歡用macrodef。

3. Java task 與 Exec task 直接執行Java類或程式

   注意執行目錄的定義。另在Windows下如果要直接運行dos視窗中的命令,以下指令啟動預設瀏覽器訪問localhost:

   <exec executable="cmd.exe">
      <arg line="/c start http://localhost:8080>
   </exec>   "/

4. 擴充Ant的Task

   擴充ant task很簡單,實現execute() 方法執行task,實現setter介面讓ant架構執行屬性注入。繼承Task 獲得一些ant的能力,比如查詢某個變數的值。

   稍微有點麻煩的是多層嵌套屬性的注入。詳細請看http://ant.apache.org/manual/developlist.html

   SpringSide 2.0 裡很簡單的實現了一個XML File Merge的task,見XmlMergeTask.java。

   裡面的一個教訓是如果變數是檔案或路徑,需要把變數聲明為java.io.File或者org.apache.tools.ant.types.Path,Ant才會在注入時為相對路徑加上project.basedir。

   蛋蛋 說擴充Ant的最方便的方法還是在ANT裡嵌套指令碼。匯入BSF庫以後,你就可以用BSF支援的指令碼語言了(見Script Task)。接下來有機會嘗試一下。

 5. 檔案操作

  剛好springside裡進行了比較多的檔案操作,隨便記一下。

  replace 與 copy 時加入filter, 都可以進行字串替換.

  concat在檔案末添加其他檔案的內容。

  好睏,很多東西沒寫詳細,明天再補充。

  題外話,Ant 完整示範了如何編寫XML式的代碼,雖然對於開發人員來說XML編碼非常麻煩,遠遠沒有Ruby的rake以ruby代碼本身來構建系統清晰,但對於IDE,特別是希望圖形化編程的IDE來說,XML比普通代碼要容易渲染得多,所以普元EOS的圖形化編程也是序列成XML代碼。再另外,Ant的task 和 普元的構件也有相似。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.