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

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更加簡潔清晰。


【1】Make_(software)
【2】What's wrong with gnu make
【3】Apache_Ant
【4】Apache_Maven
【5】本文圖片來自few-points-on-java-build-tools-ant-vs-maven-vs-gradle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章