gradle插件分為兩種筐带,一種是腳本插件
廓八,一種是對象插件
。
腳本插件:腳本插件就是一個普通的xxx.gradle
文件其馏,通過在xxx.gradle定義一系列task,在另一個gradle文件中通過
apply from:'xxx.gradle'
引用即可使用xxx.gradle定義的task爆安。
主工程根目錄創(chuàng)建xxx.gradle文件(xxx代表任意)
xxx.gradle文件
task testPlugin{
doLast{
println("xxx.gradle doLast")
}
}
module工程引用叛复,本次是app主工程的build.gradle引用:
apply from:"../xxx.gradle"
主要xxx.gradle與app工程同級因此需要../
引用完成后就可以輸入編譯命令:
gradle testPlugin
輸出:
> Task :app:testPlugin
xxx.gradle doLast
對象插件
對象插件是指實現(xiàn)了org.gradle.api.Plugin
接口的類。類需要實現(xiàn)void apply(T target)
方法扔仓,T為泛型代表插件
作用到的對象褐奥。通常為Project對象。
編寫對象插件有三種方式:
1.直接在gradle腳本文件中
2.在工程的buildSrc工程下面
3.獨立工程
相比而言翘簇,1和2兩種方式都是不對外暴露的撬码,只能在當(dāng)前工程或者module之間使用,如果要讓其他項目使用還是需要使用
第三種方式版保。
下面我們一一來實現(xiàn)一下:
在gradle腳本中實現(xiàn)
此方法最簡單呜笑,直接打開app.gradle寫入,下面代碼增加動態(tài)配置的代碼
1.實現(xiàn)Plugin接口找筝,重寫apply方法
插件拓展
class CustomExtension{
def message = "extension message"
def what = 0
}
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project target) {
//插件擴展參數(shù)為名稱 類型 和參數(shù)(可無)
def extension = target.extensions.create("cusExtension",CustomExtension)
target.task("pluginTask"){
doLast{
println("task name is ${name} message is ${extension.message} what is ${extension.what}")
}
}
}
}
配置擴展
cusExtension.message = "extension change message"
通過DSL塊配置擴展
cusExtension{
message = "extension DSL change message"
what = 2
}
2.依賴插件
apply plugin : CustomPlugin
執(zhí)行命令:
gradlew pluginTask
輸出結(jié)果:
> Task :pluginTask
task name is pluginTask message is extension DSL change message what is 2
buildSrc目錄下
工程目錄下新建buildSrc moudle
蹈垢,因為buildSrc不是一個Android moudle工程慷吊,因此需要我們做一些處理袖裕。
1.刪除工程目錄下main文件夾中的資源
2.在main文件夾下新建groovy
文件夾(buildSrc/src/main/groovy
)并創(chuàng)建包名文件夾,在包名文件夾下創(chuàng)建 CustomAlonePlugin.groovy
文件(CustomAlonePlugin是文件名)溉瓶,我們的插件代碼在寫在其中急鳄。
注意:一定要寫.groovy后綴,不然工具識別不出
package com.myplugin
import org.gradle.api.Plugin
import org.gradle.api.Project
public class CustomAlonePlugin implements Plugin<Project> {
@Override
void apply(Project target) {
//插件擴展參數(shù)為名稱 類型 和參數(shù)(可無)
def extension = target.extensions.create("cusExtension",CustomExtension)
target.task("pluginTask"){
doLast{
println("task name is ${name} message is ${extension.message} what is ${extension.what}")
}
}
}
}
class CustomExtension{
def message = "extension message"
def what = 0
}
其中CustomExtension是配置項堰酿,供依賴項動態(tài)配置修改疾宏,配置方法和上面配置一樣
3.main文件夾下面創(chuàng)建resources
文件夾,在此文件夾下創(chuàng)建META-INF/gradle-plugins
文件夾路徑触创,在此文件夾中創(chuàng)建myCustomPlugin.properties
文件(buildSrc/src/main/resources/META-INF/gradle-plugins/myCustomPlugin.properties
)坎藐。
注意myCustomPlugin就是插件的id(可修改),供其他module依賴。
4.myCustomPlugin.properties文件夾下配置代碼:
implementation-class = com.myplugin.CustomAlonePlugin//對應(yīng)插件的類
5.build.gradle下添加依賴
apply plugin: 'groovy'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
6.依賴插件
寫完上面的代碼后岩馍,module就可以依賴了
apply plugin : 'myCustomPlugin'
//配置擴展
cusExtension.message = "extension change message"
//通過DSL塊配置擴展
cusExtension{
message = "extension DSL change message"
what = 2
}
執(zhí)行:
gradlew pluginTask
結(jié)果:
> Task :pluginTask
task name is pluginTask message is extension DSL change message what is 2
獨立工程
buildSrc
中創(chuàng)建插件只能在單一工程下多模塊復(fù)用碉咆,要想在多個項目中復(fù)用就需要使用獨立工程編寫插件
,然后將插件上傳到maven倉庫
中蛀恩,最后在需要以來的項目中顯式的添加對插件的依賴
疫铜。
為了節(jié)省時間我們直接在本工程中創(chuàng)建一個standalone插件模塊,但是我們要注意的是這是一個完全獨立模塊双谆。
可以看到獨立工程的模塊和buildSrc模塊結(jié)構(gòu)是一樣的壳咕。區(qū)別在于buildSrc代碼在構(gòu)建是自動會被編譯并被引用。
而獨立模塊的則需要編譯之后上傳到maven倉庫中顽馋,然后在需要引用的項目中顯式的引用谓厘。
插件代碼和之前一樣只是改了名稱
package com.myplugin
import org.gradle.api.Plugin
import org.gradle.api.Project
public class StandAlonePlugin implements Plugin<Project> {
@Override
void apply(Project target) {
//插件擴展參數(shù)為名稱 類型 和參數(shù)(可無)
def extension = target.extensions.create("cusExtension",StandExtension)
target.task("pluginTask"){
doLast{
println("task name is ${name} message is ${extension.message} what is ${extension.what}")
}
}
}
}
class StandExtension{
def message = "extension message"
def what = 0
}
build.gradle則有的不同,因為需要發(fā)布到maven寸谜,所以增加了發(fā)布的代碼:
引用依賴apply plugin: 'maven'
庞呕,通過maven插件快速的配置group version和uploadArchives
相關(guān)屬性。
為了方便本次上傳到主工程repo文件夾下面
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
group 'com.myplugin.plugin'
version '1.0.0'
uploadArchives{
repositories {
mavenDeployer {
repository(url:uri('../repo'))
}
}
}
然后執(zhí)行命令gradlew uploadArchives
或者在AS右側(cè)邊欄對應(yīng)工程的tasks中找到uploadArchives
程帕,
點擊執(zhí)行住练。執(zhí)行完畢后就可以在主工程找到repo目錄。里面存放的是生成好的jar包與一些文件愁拭。maven-metadata.xml
存放的是配置信息
<metadata>
<groupId>com.myplugin.plugin</groupId>
<artifactId>standalone</artifactId>
<versioning>
<release>1.0.0</release>
<versions>
<version>1.0.0</version>
</versions>
<lastUpdated>20191225120458</lastUpdated>
</versioning>
</metadata>
然后我們就可以在主工程build.gradle依賴插件讲逛。依賴規(guī)則
classpath 'groupId:artifactId:version'
同時在repositories中添加依賴路徑
maven {
url uri('repo')
}
buildscript下配置代碼如下:
buildscript {
repositories {
//maven倉庫路徑
maven {
url uri('repo')
}
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
//依賴
classpath 'com.myplugin.plugin:standalone:1.0.0'
}
}
依賴完成后我們可以在對應(yīng)的子工程的build.gradle中進行依賴插件
apply plugin :'standAlonePlugin'
cusExtension.message = "extension change message"
//通過DSL塊配置擴展
cusExtension{
message = "extension DSL change message"
what = 2
}
執(zhí)行命令:
gradlew pluginTask
輸出日志:
StandAlonePlugin task name is pluginTask message is extension DSL change message what is 2
說明引用成功。
總結(jié):
1.插件分為腳本插件和對象插件
2.腳本插件直接在.gradle文件中編寫岭埠,通過apply from '文件名.gradle'引用
3.對象插件需要繼承Plugin類盏混,實現(xiàn)apply方法∠郏可以在當(dāng)前build.gradle中編寫也可以在buildSrc模塊中
編寫還可以在獨立工程中編寫许赃。當(dāng)前模塊下編寫的可以通過apply plugin :'ClassName'依賴。buildSrc和獨立模塊通過pluginId依賴apply plugin:'pluginId'
本文寫的插件只是一些簡單的插件馆类,目的是簡單了解一下gradle的流程混聊。
本文參考:玉剛說文章
官方自定義插件文章