從 make 到 gradle,淺談自動化構建工具

  • 2019 年 12 月 24 日
  • 筆記

Gnu Make

說起自動化構建工具,不得不提make【1】。make有著悠久的歷史。1977年,斯圖亞特·菲爾德曼在貝爾實驗室里製作了這個軟體,並將其包含在了Unix系統中。這款軟體是一個工具程式(Utility software),通過讀取叫做「makefile」的文件,自動化構建軟體。

大多數情況下,他被用來編譯程式碼,生成結果程式碼,然後把結果程式碼鏈接起來生成可執行文件或者哭文件。Make出現之後,很快的就普及開來,在眾多的依賴關係檢查工具中,make是應用最為廣泛的一個。2003年,斯圖亞特·菲爾德曼因為發明了這樣一款重要的工具而接受了美國電腦協會(ACM)頒發的軟體系統獎。直到現在,make仍然被用來編譯很多完整的作業系統。

CFLAGS ?= -g    all: helloworld    helloworld: helloworld.o      # Commands start with TAB not spaces      $(CC) $(LDFLAGS) -o $@ $^    helloworld.o: helloworld.c      $(CC) $(CFLAGS) -c -o $@ $<    clean: FRC      rm -f helloworld helloworld.o    # This pseudo target causes all targets that depend on FRC  # to be remade even in case a file with the name of the target exists.  # This works with any make implementation under the assumption that  # there is no file FRC in the current directory.  FRC:

儘管瑕不掩瑜,必須承認make在可靠性、性能和實現語言上有著許多缺陷【2】,尤其是在大項目中,make的缺點會在很大程度上被放大。

Apache Ant

2000年,源於Apache Tomcat工程的ant(another neat tool)問世【3】。Ant和make類似,但是以java實現,主要用於構建java工程。Ant與make最大的不同之處就是ant使用XML來描述構建過程和依賴關係。XML作為一種語言,能夠清楚的定義每個task做什麼,有哪些依賴。

而且,這些資訊都可以在ant script中找到。更為引人注目的是,ant可以很好的支援junit的集成,因此使用ant的開發者可以很容易的進行test-driven開發,甚至極限編程。然而,不可否認的是ant仍然有很多缺點。

例如,由於ant結構靈活,所以一般為所有的項目定義一個統一的ant框架(例如Oracle的TestLogic) 但是隨著項目的複雜度和數量的增加,項目與項目之間的差異化逐漸加大,最終,即使是一個經驗豐富的程式設計師,如果不仔細研讀ant腳本,依然很難讀懂ant工程的higher level結構。

Apache Maven

作為一款構建工具,Maven【4】發佈於2004年,與ant不同,主要通過約定(convention)定義構建過程;另外,Maven的功能是通過plugin實現和擴展的;在構建過程中,Maven會自動將java類庫和Maven plugin下載到本地。Maven主要解決兩個方面的問題:

  1. 如何構建工程
  2. 描述對外部組件和Module的依賴關係

Maven的一些優勢是相對的,例如,通過約定定義工程固然能提高可讀性從而提高開發效率,但是這是建立在開發者能從Maven的角度理解工程的基礎之上的,也就是說開發者必須理解Maven是如何工作的。因此一個剛剛接觸Maven 的開發者很難直接從Maven工程文件中讀懂在執行過程中到底發生了什麼。

總之,ant更加靈活,但容易帶來混亂;Maven更加規範,但是學習曲線較為陡峭。

Gradle

Gradle發佈於2012年,是JVM生態下又一款開源的自動化構建工具(其他兩款是Ant,Maven),建立在Apache Ant和Apache Maven的基礎上,引入了基於Groovy的DSL(domain-specific language)代替XML,聲明工程的configuration。

可伸縮性強大,性能出色。支援task之間的依賴設定;不僅可以以默認的形式引用在Maven中聲明的約定,而且可以對其進行訂製化;支援動態下載外部jar類庫和plugin。DSL的引入,使得Gradle較之與ant和maven更加簡潔清晰。

鏈接:https://www.jianshu.com/p/42b086cd91aa