如何自己動手擼一個Gradle外掛
前言
前面我們已經把gradle中groovy的一些語法,以及常用的project和task介紹了一遍,那麼我們通過自己擼個外掛。剛好把前面的內容鞏固下。
外掛的作用
首先我們需要了解下外掛的作用,主要有如下幾點:
-
新增任務到專案中,可對專案進行測試、編譯、打包;
-
新增依賴到專案中,可用來配置專案構建過程中需要的依賴;
-
可以向專案中現有的物件型別新增新的擴充套件屬性、方法等,可方便專案的配置和構建優化,比如 Android 專案構建中的 android{} 就是AndroidGradle外掛為Project 物件新增的一個擴充套件。
外掛的分類
外掛主要是分為兩種:指令碼式外掛和二進位制式外掛。
指令碼式外掛
指令碼式外掛就類似於前面文章提到的,自己新建一個config.gradle,然後通過
apply from:"../config.gradle"
去引用config.gradle檔案中的一些屬性等,如可將某些工具性質的方法以及各個依賴使用的版本號分別定義到單個gradle檔案中,方便統一呼叫和管理各個依賴的版本號等。
二進位制式外掛
二進位制外掛一般式之通過式Plugin介面,實現apply方法。該方法中的泛型指的是此Plugin可以應用到的物件,一般是將其應用到Project物件上。一般來說二進位制外掛分為三種方式:
- Build script:直接在gradle指令碼檔案中實現plugin介面並應用,不適用於對外提供
- buildSrc project: buildSrc是Gradle 在專案中配置自定義外掛的預設目錄。一般來說很少使用
- Standalone project:獨立的工程,編譯後不僅可以對內也可以對外使用
前面兩個應用場景很少,在這就不過多介紹了,想了解的可以自己百度一下~,我們著重介紹一下最後一個。
動手擼一個 Standalone project
既然是獨立的工程,那麼首先我們需要新建一個moudle。整個建立步驟如下:
-
新建moudle,型別可以選擇Android。然後把目錄刪乾淨,只留下build.gradle檔案並把build.gradle內部清空。
-
在moudle建立src/main/groovy目錄,並新建其包名。同時在main目錄下再新建resources/META-INF/gradle-plugins目錄,在這個目錄下編寫一個和外掛id名字相同的.properties檔案,這樣Gradle就可以找到外掛實現了。
修改properties檔案:
implementation-class=com.xxxx.plugin.MyGradlePlugin
修改build.gralde檔案如下:
apply plugin: 'java-gradle-plugin'
apply plugin: 'kotlin'
apply plugin: 'groovy'
apply plugin: 'maven'
apply plugin: 'maven-publish'
repositories {
mavenCentral()
}
group = '你的plugin包名'
version = '你的plugin版本號'
publishing {
repositories {
maven {
url = uri("$rootDir/repo")
}
}
publications {
maven(MavenPublication) {
from components.java
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
//gradle sdk
implementation gradleApi()
//groovy sdk
implementation localGroovy()
}
依賴groovy相關外掛是為了我們可以建立groovy檔案。依賴maven是為了後續的本地上傳以及除錯。
現在我們先寫一個簡單的試試效果。在你的目錄下新建一個plugin:
class MyGradlePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('MyGradlePlugin') {
doLast {
println('task in MyGradlePlugin')
}
}
}
}
然後我們點選Gradle -> myGradlePlugin -> publishing -> publish。執行完成後,會在專案根目錄下生成repo倉庫。也就是之前在build.gradle中配置的url。
既然本地maven已經生成了,接下來就是我們的引用了。我們在根目錄的build.gradle引用我們本地的maven。示例如下:
repositories {
google()
jcenter()
maven {
url = uri("$rootDir/repo")
}
}
本地maven依賴完成後,我們在根目錄把自己引用的外掛依賴下:
apply plugin: "myGradlePlugin"
dependencies {
...
classpath 'com.xxxx.plugin:myGradlePlugin:1.0.0'
...
}
然後我們sync一下。好了成功了。那我們如何驗證我們自己寫的plugin呢。我們在命令列輸入:
./gradlew MyGradlePlugin
然後你會發現它輸出了:
Task:MyGradlePlugin
task in MyGradlePlugin
臥槽,臥槽,成功了!!
我們加大點難度,我們需要在build.gradle動態一些屬性,並且自己寫的plugin可以讀到這些動態配置的屬性。既然需要動態配置屬性,那我們先定義一下需要動態的屬性,新建一個Extension。具體示例如下:
class MyGradlePluginExtension {
String versionName
String versionCode
String versionInfo
@Override
String toString() {
return "versionName = $versionName , versionCode = $versionCode , versionInfo = $versionInfo"
}
}
我們定義了版本的屬性,比如版本號,版本名稱,版本資訊等等。既然定義了,那麼我們怎麼讀取這些屬性呢。修改我們的plugin:
class MyGradlePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create("MyGradlePluginExtension", MyGradlePluginExtension.class)
project.task('MyGradlePluginExtension') {
doLast {
MyGradlePluginExtension releaseInfo = project.MyGradlePluginExtension
println releaseInfo
}
}
}
}
程式碼修改後,可以看到邏輯如下,建立一個MyGradlePluginExtension,然後定義一個task為MyGradlePluginExtension(我這邊為了方便2個名稱用的同一個,其實可以分開)。也就是說我們在執行MyGradlePluginExtension的Task時候,會讀取project的MyGradlePluginExtension的屬性,然後將其輸出。
重新上傳maven,這裡就不多說了,前面有提到過,然後我們在根目錄新增如下程式碼:
MyGradlePluginExtension {
versionName = 1.0
versionCode = 1.0
versionInfo = "測試第一版"
}
然後我們執行這個task,會看到面板輸出如下:
Task :MyGradlePluginExtension
versionName = 1.0 , versionCode = 1.0 , versionInfo = 測試第一版
動態配置生效了~
總結
本節主要講了Gradle外掛的分類以及我們該如何去自己寫一個外掛並進行應用。更多自定義的操作可以檢視官方文件:編寫自定義外掛
更多文章請關注我的公眾號:碼農職場