- 前言
Gradle 插件打包了可重用的構建邏輯,可在許多不同的項目和構建中使用。Gradle允許您實現自己的插件,因此您可以重復使用構建邏輯,並與他人共享。
以下是如何創建Plugin的具體流程
- 開發工具
Android Studio 3.6.3
Gradle 5.6.4
Groovy語言
- Gradle Plugin 的打包方式
-
- 構建腳本:插件邏輯寫在 build.gradle 中,適用於邏輯簡單的任務,但是該方式實現的插件在該構建腳本之外是不可見的,只能用於當前腳本。在這里不做介紹
-
buildSrc項目:該目錄buildSrc被視為包含的構建。發現目錄后,Gradle會自動編譯並測試此代碼,並將其放入構建腳本的類路徑中。對於多項目構建,只能有一個buildSrc目錄,該目錄必須位於根項目目錄中。 buildSrc應該比腳本插件更可取,因為它更易於維護,重構和測試代碼。
- 獨立項目:您可以為插件創建一個單獨的項目。這個項目產生並發布了一個JAR,您可以在多個版本中使用它並與他人共享。通常,此JAR可能包含一些插件,或將幾個相關的任務類捆綁到一個庫中。或兩者的某種組合。
- 構建腳本
創建一個簡單的插件
build.gradle class JYTPlugin implements Plugin<Project> { void apply(Project project) { println("========================"); println("hello JY Test plugin!"); println("========================"); } } apply plugin: JYTPlugin
- 創建一個buildSrc模塊
復雜的構建邏輯通常很適合作為自定義任務或二進制插件進行封裝。自定義任務和插件實現不應存在於構建腳本中。buildSrc只要不需要在多個獨立項目之間共享代碼,就可以非常方便地使用該代碼。
該目錄buildSrc被視為包含的構建。發現目錄后,Gradle會自動編譯並測試此代碼,並將其放入構建腳本的類路徑中。對於多項目構建,只能有一個buildSrc目錄,該目錄必須位於根項目目錄中。 buildSrc應該比腳本插件更可取,因為它更易於維護,重構和測試代碼。
buildSrc使用適用於Java和Groovy項目的相同源代碼約定。它還提供對Gradle API的直接訪問。其他依賴項可以在專用的build.gradle下聲明buildSrc。
我們看一下如何在Android Studio 中創建一個buildSrc 模塊 並書寫插件
1. 首先,我們使用Android Studio 創建一個 Project 。
2. 因為Android Studio 並沒創建插件的模版,所以我們使用Android Library Module,並且命名Module 的名稱為buildSrc,這里有個坑,文件夾的名字大小寫必須匹配,不然的話編譯的時候,Android Studio 會提示你“Duplicate root element buildSrc”
注:因為android studio 會自動小寫你的Module Name ,需要手動修改下
3. 創建完成后,將src/mian下面的東西刪除掉,清理掉build.gradle的內容,
生成后的目錄結構大概的情況如下
4. 由於gradle是基於groovy
,因此,我們開發的gradle插件相當於一個groovy項目。所以需要在main目錄下新建groovy
目錄,這時候groovy文件夾會被Android識別為groovy源碼目錄,代碼的部分有了,還需要配置文件的位置,需要在要在main目錄下新建resources
目錄,相似的resources目錄會被自動識別為資源文件夾,resources的目錄的固定結構是resources/META-INF/gradle-plugins/xxx.properties ,
有人會問了。為什么叫gradle-plugins,而不是gradle-plugin,難道下面可以配置多個?是的,下面可以配置多個,下面會說明properties文件的作用,理解了作用,你就會知道為什么會是s了
下圖是生成的目錄結構
5. 修改配置build.gradle
plugins { id 'groovy' } dependencies { implementation gradleApi() implementation localGroovy() }
6. 編寫插件
創建文件groovy文件,本次創建的是JYTPlugin.groovy
package com.jykit.plugin import org.gradle.api.Plugin import org.gradle.api.Project class JYTPlugin implements Plugin<Project> { void apply(Project project) { println("========================"); println("hello JY Test plugin!"); println("========================"); } }
7. 配置插件
插件已經開發完了,如何才能外面的人知道尼?如何才能被其他人使用尼?白話描述為,你叫啥?
我們在上面目錄結構的時候已經提到過配置文件是在放在resources/META-INF/gradle-plugins下的,我們需要在這個目錄下創建一個properties文件,這個文件的名字就是你插件的名字,這個文件里面的內容就是你插件的實現的類關聯,比如我們將我的插件命名為:JYTPluginName ,所以的我文件的名字叫JYTPluginName.properties,文件的內容配置為關聯方法
implementation-class=com.jykit.plugin.JYTPlugin
看下效果圖
7. 關聯使用
插件的配置已經完成,如果使用尼?
我們只需要在App的build.gradle中調用就可以了。
apply plugin: 'com.android.application' apply plugin: 'JYTPluginName' #JYTPluginName 這個名字就是我們創建的JYTPluginName.properties 配置文件的名字 ... ...
8. 看下效果
好了,我們已經完成了一個buildSrc Module的簡單開發,看下編譯一下app項目,看下效果
> Task :buildSrc:compileJava NO-SOURCE > Task :buildSrc:compileGroovy UP-TO-DATE > Task :buildSrc:processResources UP-TO-DATE > Task :buildSrc:classes UP-TO-DATE > Task :buildSrc:jar UP-TO-DATE > Task :buildSrc:assemble UP-TO-DATE > Task :buildSrc:compileTestJava NO-SOURCE > Task :buildSrc:compileTestGroovy NO-SOURCE > Task :buildSrc:processTestResources NO-SOURCE > Task :buildSrc:testClasses UP-TO-DATE > Task :buildSrc:test NO-SOURCE > Task :buildSrc:check UP-TO-DATE > Task :buildSrc:build UP-TO-DATE > Configure project :app ======================== hello JY Test plugin! ======================== CONFIGURE SUCCESSFUL in 3s CONFIGURE SUCCESSFUL in 126ms
- 獨立項目編譯
為什么要創建獨立的項目?難道直接使用buildSrc方式創建不香嗎?
buildSrc的方式是便於調試和項目內部使用,如果說外部項目想要使用你的Plugin就需要重新再項目下去創建buildSrc,這樣如果有問題需要版本修復的話,就難以統一管理了,所以Gradle 提供了一個插件管理的方法,下面我們動手看下如何創建一個獨立的項目編譯
創建獨立項目的優點
1. 插件名字自定義,
2. 可以統一進行版本管理
1. 創建一個Android Plugin Module,創建方法和上面創建buildSrc的方法類似,只是項目的名稱可以自定義,無需強制使用buildSrc,我們參照上面創建buildSrc的方法創建了一個JYTAlonePlugin
2. 編寫build.gradle
plugins { id 'groovy' id 'maven' } dependencies { implementation gradleApi() implementation localGroovy() }
3. 編寫插件
package com.jykit.plugin import org.gradle.api.Plugin import org.gradle.api.Project class JYTAlonePlugin implements Plugin<Project> { void apply(Project project) { println("========================"); println("hello JY Alone Test plugin!"); println("========================"); } }
4. 編寫配置文件
創建JYTAlonePluginName.properties並配置
implementation-class=com.jykit.plugin.JYTAlonePlugin
看下整體的效果
是不是很熟悉?沒錯,現在的步驟和創建buildSrc的東西都一樣,只是Plugin的名字有差別而已
5. 接下來,我們來配置打包,將我們的插件進行發布
我們只需要在Module下的build.gradle后面填寫一些配置就可以了
-
- goup插件的分組配置說明
- version 插件的版本管理
- 上傳的Task
group 'com.jykit.plugin.JYTAlonePlugin' #包名 version '1.0.0' #版本號 repositories { mavenCentral() } uploadArchives { #打包的Task repositories { mavenDeployer { //提交到遠程服務器: // repository(url: "http://www.xxx.com/repos") { // authentication(userName: "admin", password: "admin") // } //本地的Maven地址設置為 repository(url: uri('/Users/mac/.gradle/repos')) } } }
好了,我們配置好了,repository(url: uri('/Users/mac/.gradle/repos'))這里就寫明了我們的插件的本地位置,我們可以打開Gradle的編譯菜單
我們就可以看到uploadArchives的Task了,執行下,等待結果。
> Task :jytaloneplugin:compileJava NO-SOURCE > Task :jytaloneplugin:compileGroovy UP-TO-DATE > Task :jytaloneplugin:processResources UP-TO-DATE > Task :jytaloneplugin:classes UP-TO-DATE > Task :jytaloneplugin:jar UP-TO-DATE > Task :jytaloneplugin:uploadArchives BUILD SUCCESSFUL in 544ms 4 actionable tasks: 1 executed, 3 up-to-date 3:51:54 PM: Task execution finished 'uploadArchives'.
可以看到,我們已經執行成功了,再去我們的配置的本地路徑去看下
我們的插件已經生成成功了。
6. 使用插件
使用插件也比較簡單,可以參照android studio的自有插件的寫法配置下
在Project的build.gradle 中告知編譯器,我需要使用本地倉庫查找插件,並告知依賴的插件的名字
buildscript { repositories { google() jcenter() // 告知編譯器,我需要使用本地倉庫的位置 maven { url uri('/Users/mac/.gradle/repos') } } dependencies { classpath 'com.android.tools.build:gradle:3.6.3' //鏈接我的插件,其中 com.jykit.plugin.JYTAlonePlugin 為之前創建的group的名字 // jytaloneplugin 為你的Moudel的名字 // 1.0.0 為配置的version classpath 'com.jykit.plugin.JYTAlonePlugin:jytaloneplugin:1.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
配置完了如上配置,你可以編譯一下工程,細心的同學會發現,你的的編譯器中會顯示在現在這個插件
在需要使用app的build.gradle 中就可以配置這個Plugin的使用啦
apply plugin: 'JYTAlonePluginName' //JYTAlonePluginName 是你的配置JYTAlonePluginName.properties文件的名字
OK ,我們去編譯一下Project,看下效果
> Task :buildSrc:compileJava NO-SOURCE > Task :buildSrc:compileGroovy UP-TO-DATE > Task :buildSrc:processResources UP-TO-DATE > Task :buildSrc:classes UP-TO-DATE > Task :buildSrc:jar UP-TO-DATE > Task :buildSrc:assemble UP-TO-DATE > Task :buildSrc:compileTestJava NO-SOURCE > Task :buildSrc:compileTestGroovy NO-SOURCE > Task :buildSrc:processTestResources NO-SOURCE > Task :buildSrc:testClasses UP-TO-DATE > Task :buildSrc:test NO-SOURCE > Task :buildSrc:check UP-TO-DATE > Task :buildSrc:build UP-TO-DATE > Configure project :app ======================== hello JY Alone Test plugin! ======================== CONFIGURE SUCCESSFUL in 2s CONFIGURE SUCCESSFUL in 109ms
關於網絡的maven倉庫或者在本地創建http的倉庫,可以參照Nexus搭建
以上是為了學習記錄使用