Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          導航

          公告


          • 關于我
          • 人生是一場對話
          • gaoyuxiang AT gmail DOT com
          • titlelogo.png

          • 我的譯作
          • Scala for the Impatient
          • Open Source SOA
          • Programming in Scala

          • 聲明
          • 所有文章和代碼在這里以"現狀"提供,作者不提供任何形式的擔保,也沒有授予除閱讀和有條件共享之外的任何權利。除非特別說明,所有文章均為本blog作者原創,如需轉載請注明出處和原作者,如用于商業目的,需作者本人書面許可。

          • 推薦文章
          • Pylons起步

          常用鏈接

          留言簿(29)

          隨筆分類(842)

          隨筆檔案(507)

          文章檔案(4)

          Friends' blogs

          搜索

          •  

          積分與排名

          • 積分 - 782753
          • 排名 - 54

          最新評論

          閱讀排行榜

          評論排行榜


          隨著項目越來越大,你的ANT腳本變得越來越臃腫,越來越依賴antcontrib來實現構建邏輯?不想放棄對構建過程和產出做精細的控制?恨不得自己寫ANT Task?

          等一等,在你考慮轉向Maven或者真正卷起袖子開始研究ANT Task的API之前,先聽我向你推薦Ruby/JRuby。相信我,也許這才是你真正需要的。

          在我看來構建腳本最主要的要求是表達能力和控制能力,表達能力是我們應該能夠很方便的告訴它我們要它做什么,而控制能力是我們告訴它如何去做,除了必要的 構建命令的參數、依賴關系之外,它應該能夠理解我們其他一些特殊要求。在項目相對簡單時,ANT的XML格式的"腳本語言"能夠比較好的表達構建者的要 求,至少比純Java的方式更加簡單清晰,于是幾乎從它誕生之日就成為Java領域當仁不讓的頭號構建工具。但是ANT也有它不夠用的時候,尤其在控制能 力上,為了實現實際使用中越來越復雜越來越精細的對構建過程和產出的要求,ANT的使用者們開始對ANT進行擴展,最具影響力的"非官方"擴展可能就是 antcontrib了,很多實際Java項目的構建文件中我們都能夠找到它的影子。但是一堆taskdef和之類的夾雜在ANT腳本里,怎么看怎么覺得別扭,也嚴重影響構建腳本的可讀性。

          我發現我需要的是一個具有完整功能腳本語言來寫我的構建邏輯:一方面它要足夠簡單,我需要清晰的表達我的意圖,另一方面當我需要的時候它要足夠強大來幫我實現精細的控制。我自然而然想到Ruby。

          由于Ruby是一個功能完整的工具,完全自己寫Ruby腳本來調用Java自己的構建工具如javac、jar等等并非不可能,但是既然已經有人做了輪 子,我們拿來用就是了,大不了自己再改裝一下,也少走些彎路。時下比較流行的解決方案有Buildr、Raven、Rant和Antwrap,它們各有特 點,大家可以根據需要進行選擇。

          我最終選了其中最"輕量"的Antwrap,原因嘛,我不想學新的API,我已經熟悉ANT常用的Task,而且我希望盡可能多的自己控制構建的過程和產 出。Antwrap最能夠滿足我的需要。而前不久JRuby剛剛發布了1.0版,這樣一來Ruby和Java的跨界引用變得更加容易,Ruby的實現自然 就選擇了JRuby。

          安裝JRuby和Antwrap相當容易,只要把下載的jruby-bin-1.0.tar.gz/.zip解壓到本地,確保JAVA_HOME和 CLASSPATH的配置,然后gem install Antwrap (選擇Java版) 即可。為了順利加載Antwrap,需要在CLASSPATH中包含ANT的ant.jar和ant-launcher.jar。(當然,如果想更加方便 的share你的成果,可以把ant的文件拷貝到jruby目錄下,在jruby的啟動腳本加入必要的export/set命令,然后打包,這樣別人只要 從你提供的zip包解壓出來即可使用。)

          為了給大家一個直觀的感覺,舉個簡單的例子(貌似BlogJava沒有提供對Ruby代碼的默認支持,大家將就看吧):
          ?1?require?'rubygems'
          ?2?gem?'Antwrap'
          ?3?require?'antwrap'
          ?4?
          ?5?@ant=AntProject.new(:name=>"SampleAntwrapBuild",?:basedir=>".")
          ?6?@cvsroot=":pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct"
          ?7?
          ?8?def?cvscheckout
          ?9?????@ant.cvs(
          10?????????:cvsroot=>"#{@cvsroot}",?
          11?????????:command=>"checkout?-A",?
          12?????????:package=>".",?
          13?????????:dest=>"cvsoriginal",?
          14?????????:compressionlevel=>"9")
          15?end
          16?
          17?def?cvsupdate
          18?????@ant.cvs(
          19?????????:cvsroot=>"#{@cvsroot}",?
          20?????????:command=>"update?-A?-d",?
          21?????????:package=>".",?
          22?????????:dest=>"cvsoriginal",?
          23?????????:compressionlevel=>"9")
          24?end
          25?
          26?def?compile(project_name)
          27?????@ant.javac(
          28?????????:srcdir=>"cvsoriginal/#{project_name}/src",?
          29?????????:destdir=>"cvsoriginal/#{project_name}",?
          30?????????:target=>"1.5",?
          31?????????:encoding=>"GBK")
          32?????@ant.copy(????:todir=>"cvsoriginal/#{project_name}")?do
          33?????????fileset(:dir=>"cvsoriginal/#{project_name}/src")?do
          34?????????????exclude(:name=>"**/*.java")
          35?????????end
          36?????end
          37?????@ant.jar(
          38?????????:destfile=>"build/#{project_name}.jar",?
          39?????????:basedir=>"cvsoriginal/#{project_name}",?
          40?????????:manifest=>"MANIFEST.MF")?do
          41?????????exclude(:name=>"src/**")
          42?????end
          43?end
          44?
          45?#?to?actually?call?your?target
          46?if?ARGV.empty?
          47?????puts?"Usage:?jruby?#{$0}?[target]"
          48?else
          49?????eval?ARGV[0]
          50?end
          51?

          可以看到幾乎都是我們熟悉的ANT Task,只是更加緊湊更加靈活,一旦掌握了最最基本的Ruby語法,用它寫出功能強大的構建腳本可以說是分分鐘搞定。


          主站蜘蛛池模板: 罗山县| 青河县| 巩义市| 弥渡县| 拜城县| 浦城县| 马尔康县| 金溪县| 新和县| 郎溪县| 天全县| 新绛县| 珲春市| 湟中县| 彭阳县| 松江区| 平乡县| 镶黄旗| 斗六市| 且末县| 梓潼县| 淅川县| 宁城县| 绵阳市| 通化市| 周至县| 拜泉县| 贡嘎县| 滁州市| 疏勒县| 二连浩特市| 无为县| 佛冈县| 集贤县| 鱼台县| 青神县| 石棉县| 甘泉县| 阿瓦提县| 长海县| 兴和县|