簡介
gradle的最新版本是6.7,從2009年的第一個版本,到2020年的6.7,已經發展了11年了。gradle是作爲android的官方構建工具引入的,除了java,它還能夠支持多種語言的構建,所以用途非常廣泛。
gradle是開源的構建工具,你可以使用groovy或者kotlin來編寫gradle的腳本,所以說gradle是一個非常強大的,高度定製化的和非常快速的構建工具。
根據我的瞭解,雖然gradle非常強大,但是對於java程序員來說,一般還是都使用的maven,或者同時提供maven和gradle兩種構建方式。
爲什麼會這樣呢?個人覺得有兩個原因:
第一個原因是gradle安裝文件和依賴包的網絡環境,如果單單依靠國內的網絡環境的話,非常難安裝完成。
第二個原因就是gradle中需要自己編寫構建腳本,相對於純配置的腳本來說,比較複雜。
安裝gradle和解決gradle安裝的問題
gradle需要java8的支持,所以,你首先需要安裝好JDK8或者以上的版本。
安裝gradle有兩種方式,一種就是最簡單的從官網上面下載安裝包。然後解壓在某個目錄,最後將PATH指向該目錄下的bin即可:
如果你想使用包管理器,比如MAC上面的brew來進行管理的話,則可以這樣安裝:
但是這樣安裝很有可能在下載gradle安裝包的時候卡住。
怎麼辦呢?
這時候我們需要自行下載gradle-6.4.1-bin.zip安裝包,然後將其放入http服務器中,讓這個壓縮包可以通過http協議來訪問。
簡單點的做法就是將這個zip文件拷貝到IDEA中,利用IDEA本地服務器的預覽功能,獲得zip的http路徑,比如:http://localhost:63345/gradle/gradle-6.7-all.zip.
接下來就是最精彩的部分了,我們需要修改gradle.rb文件:
使用上面的命令可以修改gracle.rb文件,我們替換掉下面的一段:
url替換成爲http://localhost:63345/gradle/gradle-6.7-all.zip,而sha256可以使用 sha256sum gradle-6.7-all.zip這個命令來獲取。
替換之後,重新執行brew install gradle即可安裝完成。
安裝完畢之後,我們使用gradle -v命令可以驗證是否安裝成功:
Gradle特性
gradle作爲一種新的構建工具,因爲它是依賴於groovy和kotlin腳本的,基於腳本的靈活性,我們通過自定義腳本基本上可以做任何想要的構建工作。
雖然說gradle可以做任何構建工作,但是gradle現在還是有一定的限制,那就是項目的依賴項目前只支持於maven和Ivy兼容的存儲庫以及文件系統。
gradle通過各種預定義的插件,可以輕鬆的構建通用類型的項目,並且支持自定義的插件類型。
另外一個非常重要的特性是gradle是以任務爲基礎的,每一個build都包含了一系列的task,這些task又有各自的依賴關係,然後這些task一起構成了一個有向無環圖Directed Acyclic Graphs (DAGs)。
有了這個DAG,gradle就可以決定各個task的順序,並執行他們。
我們看兩個task DAG的例子,一個是通用的task,一個是專門的編譯java的例子:
task可以依賴task,我們看個例子:
一個task可以包含Actions,inputs和Outputs。根據需要這些類型可以自由組合。
標準task
Gradle包含了下面7種標準的task:
clean :用來刪除build目錄和裏面的一切。
check:這是一個生命週期任務,通常做一些驗證工作,比如執行測試任務等。
assemble :這是一個生命週期任務,用來生成可分發的文件,比如jar包。
build:也是一個生命週期任務,用來執行測試任務和生成最後的production文件。通常我們不在build中直接做任何特定的任務操作,它一般是其他任務的組合。
buildConfiguration:組裝configuration中指定的archives。
uploadConfiguration:除了執行buildConfiguration之外,還會執行上傳工作。
cleanTask:刪除特定的某個task的執行結果。
Build phases
一個gradle的build包含了三個phases:
Initialization:初始化階段。gradle支持一個或者多個project的build。在初始化階段,gradle將會判斷到底有哪些project將會執行,並且爲他們分別創建一個project實例。
Configuration:配置階段。gradle將會執行build腳本,然後分析出要運行的tasks。
Execution:執行階段。gradle將會執行configuration階段分析出來的tasks。
Gradle Wrapper
上面講的是gradle的手動安裝,如果是在多人工作的環境中使用了gradle,有沒有什麼辦法可以不用手動安裝gradle就可以自動運行gradle程序呢?
方法當然有,那就是gradle wrapper:
gradle wrapper是一個工具,通過它我們可以方便的對本地的gradle進行管理。
上圖列出了gradle wrapper的工作流程,第一步是去下載gradle的安裝文件,第二步是將這個安裝文件解壓到gradle的用戶空間,第三步就是使用這個解壓出來的gradle了。
我們先看下怎麼創建gradle wrapper:
雖然Gradle wrapper的作用是幫我們下載和安裝gradle,但是要生成gradle wrapper需要使用gradle命令纔行。也就是說有了wrapper你可以按照成功gradle,有了gradle你纔可以生成gradle wrapper。
假如我們已經手動按照好了gradle,那麼可以執行下面的命令來生成gradle wrapper:
先看下生成出來的文件結構:
gradle/wrapper/gradle-wrapper.properties 是 wrapper的配置文件,我們看下里面的內容:
其中distributionUrl就是我們要下載的gradle的路徑,其他的配置是gradle的安裝目錄。
一般來說有兩種安裝文件類型:bin和all。bin和all的區別在於,bin只有安裝文件,而all還包含了gradle的文檔和樣例代碼。
我們可以通過–distribution-type參數來修改安裝文件的類型。此外還有 –gradle-version ,–gradle-distribution-url和–gradle-distribution-sha256-sum 這幾個參數可以使用。
除了配置文件之外,我們還有3個文件:
gradle-wrapper.jar:wrapper業務邏輯的實現文件。
gradlew, gradlew.bat :使用wrapper執行build的執行文件。也就是說我們可以使用wrapper來執行gradle的build任務。
wrapper的使用
我們可以這樣使用gradlew,來執行build:
注意,如果你是第一次在項目中執行build命令的話,將會自動爲你下載和安裝gradle。
wrapper的升級
如果我們想要升級gradle的版本,也很簡單:
或者直接修改 gradle-wrapper.properties 也可以。
一個簡單的build.gradle
我們看一個非常簡單的gradle的例子:
上面我們需要安裝一個application plugin,使用的是jcenter的依賴倉庫,還指定了幾個具體的依賴項。最後,指明瞭我們應用程序的mainClass。
gradle使用maven倉庫
build.gradle中的repositories指明的是使用的倉庫選項。
默認情況下gradle有自己的本地倉庫,一般在~/.gradle目錄下面,如果我們之前用的是maven倉庫,那麼在本地的maven倉庫中已經存在了很多依賴包了,如何重用呢?
我們可以這樣修改repositories:
這樣的話, 就會優先從maven的倉庫中查找所需的jar包。
總結
本文只是一個很簡單的gradle介紹,讓大家對gradle有一個基本的瞭解,後面我們會詳細的介紹gradle的各種用法,敬請期待。
本文分享自微信公衆號 - 程序那些事(flydean-tech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。