阿里P7移動互聯網架構師進階視頻(每日更新中)免費學習請點擊:https://space.bilibili.com/474380680
本篇文章將繼續從自定義 Gradle 插件開發來介紹自動化構建系統Gradle:java
Gradle 插件是一個可以將 Gradle 的構建邏輯(build logic)和構建任務(build task)打包到一塊兒,以便在多個項目的構建腳本(build.gradle)中應用(apply)的工具。android
例如,build.gradle
構建腳本文件內 apply plugin: 'java'
、apply plugin: 'com.android.application'
中的 java、com.android.application 就是官方提供的 Gradle 插件,經過應用這些插件,能夠豐富項目的構建任務與構建邏輯。git
除官方提供的插件外,Gradle 還容許開發者定義本身的 Gradle 插件。開發者能夠根據實際需求定義本身的構建邏輯和構建任務,將其打包爲 Gradle 插件,從而在多個項目的構建腳本中複用。此外,還能夠將自定義的 Gradle 插件發佈到 plugin portal或其餘倉庫中,更爲方便的分享給他人使用。github
Gradle 插件對編程語言沒有太多限制,只要是可以被編譯爲 JVM 字節碼的編程語言,都能用來編寫 Gradle 插件。Gradle-API 的被設計爲對 Groovy、Java、Koltin 友好的,一般狀況下,使用 Java 或 Kotlin 這類靜態類型語言實現的 Gradle 插件的性能要比使用 Groovy 實現的相同常見的性能更好。web
Gradle 做爲一個普通的構建工具,自己並不依賴任何可視化 GUI 工具。爲簡化步驟,本文將採用命令行方式來完成自定義 Gradle 插件的演示。在開始以前,需先將 gradle 命令添加到系統環境變量中。編程
若讀者在 IDEA / Android Studio 使用過 gradle ,則可在當前用戶目錄下找到 gradle 命令,具體路徑以下api
/Users/當前用戶名/.gradle/wrapper/dists/gradle版本/沙盒路徑/gradle版本/bin
C:\Users\當前用戶名\.gradle\wrapper\dists\gradle版本\沙盒路徑\gradle版本\bin
若讀者的電腦中還沒有安裝 gradle,則可在 Gradle 官方 下載安裝。bash
以筆者使用的環境爲例,gradle 命令所在目錄爲架構
將 gradle 命令所在目錄添加到環境變量中app
~/.bashrc
中添加在命令行中輸入
獲得以下輸出則表示 gradle 環境設置成功
自定義 gradle 插件能夠在如下三個地方建立,分別是:
在 build.gradle
內直接建立 Gradle 插件
優勢:
build.gradle
中建立的插件將<u>被自動編譯幷包含在 classpath 中</u>,使用時無需在構建腳本內指定 classpath缺點:
示例
1. 建立 BuildInDemo
目錄
2. 在 BuildInDemo
目錄內中新建 build.gradle
文件
使用 tree
命令查看建立後的目錄結構,以下所示
3. 在 BuildInDemo/build.gradle
內建立並應用 Gradle 插件,代碼以下
4. 構建此 build.gradle
文件
Gradle 構建時將執行 build.gradle
中的代碼,當執行到 apply plugin: BuildInPlugin
時,將會調用 BuildInPlugin 的實例方法 apply(Project p)
。所以在構建過程當中,能夠看到以下輸出,其中第 2 行即爲上一步自定義插件中打印的內容,代表插件應用成功
rootProject/buildSrc 文件夾是 Gradle 的預留目錄,用來存放當前項目私有 Gradle 插件的源代碼與構建腳本
優勢:
缺點:
示例
1. 建立 PluginBuildSrcDemo
項目模塊
建立 PluginBuildSrcDemo
目錄,並在該目錄下建立 build.gradle
文件
2. 建立 buildSrc
子模塊
2.1 在 PluginBuildSrcDemo
目錄下建立 buildSrc
目錄
2.2 在 PluginBuildSrcDemo/buildSrc
目錄下建立 buildSrc 子模塊的構建腳本文件 build.gradle
PluginBuildSrcDemo/buildSrc/build.gradle
的內容以下
2.3 建立 buildSrc 模塊的源碼目錄
2.4 建立插件文件 PluginBuildSrc.kt
PluginBuildSrc.kt
的代碼以下
2.5 聲明 Gradle 插件的 ID 與實現類
此步驟是可選的:若使用插件 ID 形式應用自定義插件,則必須進行此步驟;若使用插件實現類的形式應用自定義插件,則可跳過此步驟。
完成此步驟的方式有兩種,任選其一便可
方式 1. META-INF 方式
建立 PluginBuildSrcDemo/buildSrc/src/main/resources/META-INF/gradle-plugins
目錄
在 gradle-plugins
目錄下建立 com.example.plugin.properties 屬性文件,紅色部分表示插件的 ID
屬性文件的內容以下,表示插件 ID 爲 com.example.plugin 的插件所對應的實現類爲 com.example.plugin.PluginBuildSrc
方式 2. java-gradle-plugin 插件方式
java-gradle-plugin 是一個用於開發 Gradle 插件的輔助插件,它內置了不少輔助功能:
gradlePlugin
配置塊,可在此處配置插件的 ID 和實現類complile gradleApi()
依賴此處咱們主要使用 gradlePlugin
配置塊代替 META-INF
目錄下的屬性文件。java-gradle-plugin
的使用方式很是簡單,只需在 PluginBuildSrcDemo/buildSrc/build.gradle
構建腳本文件中簡單配置便可,以下所示。
此時在 PluginBuildSrcDemo 目錄下使用 tree
命令,能夠看到當前的目錄結構以下
3. 在 PruginBuildSrcDemo
項目模塊中應用 buildSrc
中聲明的 Gradle 插件
在 PluginBuildSrcDemo/build.gradle
構建腳本文件中添加以下代碼
應用插件時,指定插件 ID 或指定插件的實現類均可以,但指定插件 ID 的形式更爲簡短及靈活,在實際開發中也更爲常見。
在 PluginBuildSrcDemo
目錄下執行 gradle build
命令進行構建,可看到以下輸出
其中第 2 行是咱們在 buildSrc 模塊中定義的 Gradle 插件所打印日誌,代表 buildSrc 模塊 中的自定義插件在根項目中已生效。
4. 建立 SubModule
子模塊
buildSrc 模塊中定義的插件能夠在同一項目的任意模塊的構建腳本中使用,接下來便演示在 SubModule 子模塊中的應用。
4.1 建立 SubModule 目錄與構建腳本
PluginBuildSrcDemo/SubModule/build.gradle
的內容以下
4.2 將 SubModule 模塊關聯到 PluginBuildSrcDemo 項目中
在 PluginBuildSrcDemo
目錄下新建 settings.gradle
文件,內容以下
此時在 PluginBuildSrcDemo
目錄下使用 tree
命令,能夠看到項目當前的目錄結構以下
5. 在 SubModule
模塊執行構建命令
獲得以下輸出
採用 buildSrc 模塊方式時,Gradle 會妥善處理 buildSrc 模塊的構建腳本與源碼,並將其添加到當前項目的 classpath 中。但 buildSrc 方式的插件只能在項目內共享與複用,若要在其餘項目中使用該插件,還須要再進行下列操做
由於是在其餘項目中使用該項目 buildSrc 模塊 中的自定義 Gradle 插件,因此 Gradle 的 buildSrc 保留目錄優點再也不。若是將模塊名由 buildSrc
修改成其餘名稱,則可將其稱爲獨立的 Gradle 插件模塊。
在本小節中,咱們主要學習 gradle 插件的發佈與使用。
1. 建立 gradle 插件項目
與 buildSrc 方式相同,先建立構建腳本與自定義插件類
StandaloneDemo/build.gradle
的內容以下
StandaloneDemo/src/main/kotlin/com/example/plugin/StandalonePlugin.kt
的內容以下
2. 將 gradle 插件發佈到 maven 倉庫
2.1 在 StandaloneDemo/build.gradle
文件中配置發佈信息
使用 maven-publish
插件將自定義插件發佈到本地 maven 倉庫中,以下所示
2.2 使用 publishMavenPublicationToMavenLocal
任務將插件發佈到本地倉庫
執行以上命令後,gradle 會把 StandaloneDemo
中的代碼編譯打包後發佈到本地 maven 倉庫中,本地 maven 倉庫一般存放於當前用戶目錄下,具體路徑爲
~/.m2/repository
C:\Users\當前用戶名\.m2\repository
咱們能夠在此目錄下看到剛剛發佈的插件,以下圖所示
3. 在其餘項目中使用本地 maven 倉庫中的 gradle 插件
3.1 新建 OtherProject
項目
build.gradle
的文件內容以下,相比 buildSrc 方式,應用時多了 11 行的 buildscript 相關的配置信息。
3.2 構建 OtherProject
項目
輸入以上命令,獲得以下輸出
本文演示了 gradle 插件的三種建立方式,相關代碼已上傳至 github 中,點此便可查看。行文匆忙不免疏忽,若有遺漏還請斧正。