鐵人賽 專案建置方法的演進 - Jian-Min-Huang/tech-note GitHub Wiki

前言

Java 現代專案幾乎都是以 Maven 或 Gradle 作為主要建置工具,他們兩個能紅也各有其背景,今天我們一樣要從無工具一路講到現代工具。今天前言就不多廢話 COME ON ! LET'S GO !

Manual with Bash

硬派的作法,現在習慣 IDE 的新人應該少有人這樣玩過 (謎之音:阿不是先裝個 Eclipse 就萬事ok了嗎!?),孩子不要大驚小怪,沒看過用 VIM 在手,什麼我都有的神人嗎 XD

用文字編輯器編輯 .java 檔案、用 javac 指令編譯、加入 -cp 來把相依函式庫放進 classpath、看是要編成 .class 檔或是用 .jar 打包、最後再用 java 指令跑起來,其實這些東西即使是現在都還是在做,只是 IDE 都幫你做掉了。我覺得都是知識,總是懂越多越好,懂了背後原理對學其他語言也有幫助。其實大家都是這樣的,你把指令關鍵字換一下就變其他語言的作法了。

Ant & Ivy

Ant, 全名是Another Neat Tool。官方的 FAQ 是這樣描述它的。

Ant is a Java-based build tool. In theory, it is kind of like Make, without Make's wrinkles and with the full portability of pure Java code.

這就是一個 Java 寫的 build tool,有點像 C 的 Make。用一個 build.xml 來描述要執行的任務(編譯原始碼、建立 .jar 檔、靜態分析、測試與生成報告、打包原始碼、其它擴充任務。編寫好之後再交給 Ant Runtime 來執行。而因為可帶屬性參數與編寫邏輯,所以 Ant 可以做的事情自然也就多了,可擴充性也很高。從定義每個任務的這個角度來看,其實在這時已經慢慢看到專案建置標準化這件事。在辣個時代算是很成功的工具,Maven 未出時這個簡直是一統漿糊,直到現在還是有死忠粉絲。

但他的短版在兩個點,一個是擴充度真的太高,過度自由化就不容易統一流程,很容易變成各家公司有各家公司的流程。第二個是經典難解問題,library dependency hell,試想你的函式庫隨著你的應用程式龐大起來之後,在你函式庫有升版的需求時如何面對錯綜複雜的相依版本關係?一個是當然就是死都不升,或是手解跟他拼了碰碰運氣,這也就是促成 Maven 崛起的原因。不過 Ant 在後來有配合 Apache Ivy 來處理掉這個問題,只是那時天下早已是別人的天下。

Maven & Gradle

開門見山的說,Maven 能紅就是解決了 Ant 的短版。首先是他發佈了一套 Build Lifecycle 標準化了流程,然後又弄了一個函式庫的倉庫透過一些描述與定義來解掉相依問題,同時不足的地方你可以自己寫 Maven Plugin 來處理。搭上幾個大型函式庫大紅的勢頭,他就這樣一路紅起來。

那講完優點講缺點,是嘛,怎麼可能沒缺點對吧!?第一個是他的 .pom (Project Object Model) 是用 XML 定義的,XML 本身沒有問題,只是隨著時代演進他顯得笨重繁瑣。第二個是它那套標準化的流程難以輕鬆地高度客製化,你看人就是這樣,所以這也又促成後面 Gradle 的興起。但平心而論它依然是非常傑出的產品,不在意它的缺點的話,它依然十分好用。

你解決了它的缺點,我來解決你的缺點,但是我解決了你的缺點代表你以前解決的缺點變成我的缺點。好,不講解應該沒人知道我在繞什麼口令。首先 Gradle 有個大靠山,就是 Gooooogle!加上那時候 Android 使用它來建置,使用人數基本上就是海量性的增加,有需求自然演進的快,這很合理。但他大紅我覺得是因為他的設計理念的確是有高明的地方,它採用了 Groovy 語言來做腳本提高了可編程性並且提高自由度、捨棄 XML 讓自己更輕量,所以他解決了 Maven 的缺點。只是當提高自由度一不小心又讓人有感覺過度自由的 few,這有走回 Ant 的老路,不過我覺得是小事,瑕不掩瑜。

Other

另外 Java 還有另外一套,主要是 Scala 在用的,叫做 sbt,小弟在當年跳去玩 Scala 一年的時候寫過,聽說 Scala 邁入大阪號 3 了,時光飛逝阿。

那最後這邊我們來巡巡其他語言相關的工具,但這不一定完全對照 Maven 或是 Gradle 的全部功能,我個人是覺得這兩個幾乎是全面向的。其他語言有時候只會有建置的功能或是管理相依的功能,不會同時全部在一起。

大名鼎鼎的 C Make、Javascript npm or Yarn、C# NuGet、Python pip、Golang 的 ???

對,Golang 的還在爭,目前看起來是 dep 會贏,但誰也不知道會怎樣,只求不要再讓我寫 err 了 (科科)


About Me

Jian-Min Huang

wide range skill set backend engineer

Research, Architecture, Coding, DB, Ops, Infra.

mainly write Java but also ❤️ Scala, Kotlin and Go

http://github.jianminhuang.cc

http://linkedin.jianminhuang.cc

http://note.jianminhuang.cc

[email protected]