我手頭上有一個 Java 項目,在過去幾年的時間里,我小心翼翼地為之維護一個 Ant 構建腳本。Ant 能夠執行大量任務,這一點我十分欣賞;然而,我常常發現,Ant 腳本的 XML 語法編寫起來有些麻煩。而且,在 可表達性 方面,Ant 的 XML 部分還存在限制。實際上,當我發現自己需要更高程度的靈活性(例如在條件邏輯方面)時,我常常不得不在 Ant 的 script 任務中編寫(例如使用 Groovy)定制任務或嵌入式邏輯。
告別表達乏力
關于本系列
作為開發人員,我們的工作就是為終端用戶實現過程自動化;然而,很多開發人員卻忽略了將自己的開發過程自動化的機會。為此,我編寫了 讓開發自動化 這個系列的文章,專門探討軟件開發過程自動化的實際應用,并教您何時 以及如何 成功地應用自動化。
數年前,當我在尋找可表達性更強的軟件構建工具時,我聽說過 Rake。Rake 是用于使用功能全面的 Ruby 編程語言構建軟件的一種域特定語言。通過 Rake,我可以輕松獲得正在尋找的可表達性。例如,我不必編寫定制任務,因為 Rake 構建腳本是 Ruby(而不是 XML);因此,如果我需要某種條件邏輯,那么很容易在需要的地方編寫這種邏輯。而且,Rake 采用基于依賴的任務系統,這類似于 Ant 及其前輩 make 中的任務系統。例如,如果輸入 rake deploy,Rake 將調用之前設置的依賴任務,例如編譯,運行測試等等。而且 Rake 非常智能,它只運行一次依賴性任務(就像 Ant 一樣)。
對于大多數 Java 項目來說,Rake 本身并不能提供多大幫助;然而,一個相對較新的項目 Raven 將 Rake 的功能和可表達性與用于構建 Java 應用程序的特定任務結合起來。有了 Raven,Java 開發人員就有了一個真正可行的構建平臺,該平臺可提供特定于 Java 的特性,例如使用 javac 進行編譯以及使用 jar 和 war 歸檔二進制文件,同時還擁有 Ruby 編程語言的豐富的可表達性。
什么是 DSL?
域特定語言(DSL)是專門為特定任務設計的編程語言。 Java 語言和 Ruby 是通用的編程語言,而 Ant 和 Rake 是專用于構建軟件的 DSL。Rake 被認為是一種內部 DSL,因為它是用 Ruby 編寫的,并且可以使用 Ruby 進行擴展。而 Ant 是一種外部 DSL,因為它首先被解析,然后在另一種語言中執行(也就是說,首先解析 XML,然后通過 Java 程序來運行)。
Raven 是 Rake,Rake 是 Ruby
在將 Raven 用于 Java 項目之前,理解 Raven 與 Rake 之間的關系會有所幫助。圖 1 顯示了 Raven 的一個邏輯圖,可以看到,Raven 使用 Rake、RubyGems 和 Ruby。相應地,在使用 Raven 時,可以使用本地 Rake 任務。而且,還可以在 Raven 腳本中使用 Ruby。RubyGems 是類似于 CPAN、RPM 或 APT 的一個包管理器,用于下載必需的 Ruby 包(以及 Java jar)和任何依賴包。
圖 1. Raven 的邏輯圖
文章來源于領測軟件測試網 http://www.kjueaiud.com/