1. 程式人生 > >最新版gradle安裝使用簡介

最新版gradle安裝使用簡介

[toc] # 簡介 gradle的最新版本是6.7,從2009年的第一個版本,到2020年的6.7,已經發展了11年了。gradle是作為android的官方構建工具引入的,除了java,它還能夠支援多種語言的構建,所以用途非常廣泛。 ![](https://img-blog.csdnimg.cn/20201027165404549.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70) gradle是開源的構建工具,你可以使用groovy或者kotlin來編寫gradle的指令碼,所以說gradle是一個非常強大的,高度定製化的和非常快速的構建工具。 根據我的瞭解,雖然gradle非常強大,但是對於java程式設計師來說,一般還是都使用的maven,或者同時提供maven和gradle兩種構建方式。 為什麼會這樣呢?個人覺得有兩個原因: 第一個原因是gradle安裝檔案和依賴包的網路環境,如果單單依靠國內的網路環境的話,非常難安裝完成。 第二個原因就是gradle中需要自己編寫構建指令碼,相對於純配置的指令碼來說,比較複雜。 # 安裝gradle和解決gradle安裝的問題 gradle需要java8的支援,所以,你首先需要安裝好JDK8或者以上的版本。 ~~~sh ❯ java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) ~~~ 安裝gradle有兩種方式,一種就是最簡單的從官網上面下載安裝包。然後解壓在某個目錄,最後將PATH指向該目錄下的bin即可: ~~~sh ❯ mkdir /opt/gradle ❯ unzip -d /opt/gradle gradle-6.7-bin.zip ❯ ls /opt/gradle/gradle-6.7 LICENSE NOTICE bin README init.d lib media export PATH=$PATH:/opt/gradle/gradle-6.7/bin ~~~ 如果你想使用包管理器,比如MAC上面的brew來進行管理的話,則可以這樣安裝: ~~~sh brew install gradle ~~~ 但是這樣安裝很有可能在下載gradle安裝包的時候卡住。 ~~~sh ==> Downloading https://services.gradle.org/distributions/gradle-6.4.1-bin.zip ##O#- # ~~~ 怎麼辦呢? 這時候我們需要自行下載gradle-6.4.1-bin.zip安裝包,然後將其放入http伺服器中,讓這個壓縮包可以通過http協議來訪問。 簡單點的做法就是將這個zip檔案拷貝到IDEA中,利用IDEA本地伺服器的預覽功能,獲得zip的http路徑,比如:http://localhost:63345/gradle/gradle-6.7-all.zip. 接下來就是最精彩的部分了,我們需要修改gradle.rb檔案: ~~~sh brew edit gradle ~~~ 使用上面的命令可以修改gracle.rb檔案,我們替換掉下面的一段: ~~~sh homepage "https://www.gradle.org/" url "https://services.gradle.org/distributions/gradle-6.7-all.zip" sha256 "0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583" ~~~ url替換成為http://localhost:63345/gradle/gradle-6.7-all.zip,而sha256可以使用 sha256sum gradle-6.7-all.zip這個命令來獲取。 替換之後,重新執行brew install gradle即可安裝完成。 安裝完畢之後,我們使用gradle -v命令可以驗證是否安裝成功: ~~~sh gradle -v Welcome to Gradle 6.7! ~~~ # 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的例子: ![](https://img-blog.csdnimg.cn/20201027202527959.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70) task可以依賴task,我們看個例子: ~~~java task hello { doLast { println 'Hello world!' } } task intro { dependsOn hello doLast { println "I'm Gradle" } } ~~~ 一個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: ![](https://img-blog.csdnimg.cn/20201027173846957.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70) gradle wrapper是一個工具,通過它我們可以方便的對本地的gradle進行管理。 上圖列出了gradle wrapper的工作流程,第一步是去下載gradle的安裝檔案,第二步是將這個安裝檔案解壓到gradle的使用者空間,第三步就是使用這個解壓出來的gradle了。 我們先看下怎麼建立gradle wrapper: 雖然Gradle wrapper的作用是幫我們下載和安裝gradle,但是要生成gradle wrapper需要使用gradle命令才行。也就是說有了wrapper你可以按照成功gradle,有了gradle你才可以生成gradle wrapper。 假如我們已經手動按照好了gradle,那麼可以執行下面的命令來生成gradle wrapper: ~~~sh $ gradle wrapper > Task :wrapper BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed ~~~ 先看下生成出來的檔案結構: ~~~sh . ├── gradle │   └── wrapper │   ├── gradle-wrapper.jar │   └── gradle-wrapper.properties ├── gradlew └── gradlew.bat ~~~ gradle/wrapper/gradle-wrapper.properties 是 wrapper的配置檔案,我們看下里面的內容: ~~~sh distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists ~~~ 其中distributionUrl就是我們要下載的gradle的路徑,其他的配置是gradle的安裝目錄。 一般來說有兩種安裝檔案型別:bin和all。bin和all的區別在於,bin只有安裝檔案,而all還包含了gradle的文件和樣例程式碼。 我們可以通過--distribution-type引數來修改安裝檔案的型別。此外還有 --gradle-version ,--gradle-distribution-url和--gradle-distribution-sha256-sum 這幾個引數可以使用。 ~~~sh $ gradle wrapper --gradle-version 6.7 --distribution-type all > Task :wrapper BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed ~~~ 除了配置檔案之外,我們還有3個檔案: * gradle-wrapper.jar: wrapper業務邏輯的實現檔案。 * gradlew, gradlew.bat :使用wrapper執行build的執行檔案。也就是說我們可以使用wrapper來執行gradle的build任務。 ## wrapper的使用 我們可以這樣使用gradlew,來執行build: ~~~sh gradlew.bat build ~~~ > 注意,如果你是第一次在專案中執行build命令的話,將會自動為你下載和安裝gradle。 ## wrapper的升級 如果我們想要升級gradle的版本,也很簡單: ~~~sh ./gradlew wrapper --gradle-version 6.7 ~~~ 或者直接修改 gradle-wrapper.properties 也可以。 # 一個簡單的build.gradle 我們看一個非常簡單的gradle的例子: ~~~java plugins { id 'application' } repositories { jcenter() } dependencies { testImplementation 'junit:junit:4.13' implementation 'com.google.guava:guava:29.0-jre' } application { mainClass = 'demo.App' } ~~~ 上面我們需要安裝一個application plugin,使用的是jcenter的依賴倉庫,還指定了幾個具體的依賴項。最後,指明瞭我們應用程式的mainClass。 # gradle使用maven倉庫 build.gradle中的repositories指明的是使用的倉庫選項。 預設情況下gradle有自己的本地倉庫,一般在~/.gradle目錄下面,如果我們之前用的是maven倉庫,那麼在本地的maven倉庫中已經存在了很多依賴包了,如何重用呢? 我們可以這樣修改repositories: ~~~java mavenLocal() mavenCentral() ~~~ 這樣的話, 就會優先從maven的倉庫中查詢所需的jar包。 # 總結 本文只是一個很簡單的gradle介紹,讓大家對gradle有一個基本的瞭解,後面我們會詳細的介紹gradle的各種用法,敬請期待。 > 本文已收錄於 [http://www.flydean.com/gradle-kick-off/](http://www.flydean.com/gradle-kick-off/) > > 最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現! > > 歡迎關注我的公眾號:「程式那些事」,懂技術,更