开发 Gradle plugin 插件
目录
开发 Gradle plugin 插件
基础知识
Gradle 中的 Plugin 是对完成指定功能的 Task 封装的体现,只要工程依赖了某个 Plugin,就能执行该 Plugin 中所有的功能。
插件的应用都是通过 Project 的 apply
方法完成的。
插件分为二进制插件和脚本插件。
二进制插件就是实现了 org.gradle.api.Plugin
接口的插件,可以有 plugin id。二进制插件一般都是打包在一个 jar
独立发布。
apply plugin: 'java' // 'java' 就是 Java 插件的 plugin id,是唯一的,对应的类型是 org.gradle.api.plugins.JavaPlugin
apply plugin: JavaPlugin // 也可以通过该类型应用插件,包 org.gradle.api.plugins 可以去掉
脚本插件使用 apply from 关键字,后面跟一个脚本文件,可以是本地的,也可以是网络。脚本文件是模块化的基础。
apply from: 'config/project_config.gradle' // 在 build.gradle 中引用脚本文件
Project 中的 apply 有3个重载方法可以应用插件:
- void apply(Closure closure);
- void apply(Action<? super ObjectConfigurationAction> action);
- void apply(Map<String, ?> options);
第三方发布的二进制插件,需要在 buildscript
的 dependencies 中配置 classpath
才能使用
classpath 'com.android.tools.build:gradle:7.4.2' // 配置插件
自定义插件
自定义插件需要实现 Plugin 接口,这个接口只有 apply
一个方法,该方法配置阶段调用,我们可以在该方法中创建任务、创建方法等。
自定义 plugin 一般有三种方法:
- 直接写在
build.gradle
中 - plugin 源码放到
rootProjectDir/buildSrc
模块 - plugin 源码放到一个自定义的 module 中
后两种方式的目录结构
- app
- 普通的 module(或 buildSrc)
- build.gradle
- src
- main
groovy
- com.bqt.test.plugin.PluginImpl
- com.bqt.test.plugin.PluginRepoImpl
resources
- META-INF\gradle-plugins
- com.bqt.test.properties
- com.bqt.test.repo.properties
- META-INF\gradle-plugins
- main
配置
- 在 build.gradle 中配置自定义插件所需的依赖
plugins {
id 'java-gradle-plugin' // 开发 Gradle plugins 的基础插件
id 'groovy' // 使用 Groovy 语法,也可以使用 Kotlin 语法
id 'maven-publish' // 发布插件,替代之前的 maven 插件
}
sourceSets {
main {
groovy { srcDir '../src/main/groovy' }
java { srcDir '../src/main/java' }
resources { srcDir '../src/main/resources' }
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation gradleApi()
implementation localGroovy()
implementation 'com.android.tools.build:gradle:4.1.0'
}
- 在
.properties
中通过implementation-class
指向你的实现类:
implementation-class=com.bqt.test.plugin.PluginImpl
注意:
.properties
文件的文件名代表插件的 id,应用的时候需要的就是这个值
apply plugin: 'com.bqt.test'
apply plugin: 'com.bqt.test.repo'
扩展属性
插件往往在 gradle 脚本中进行参数配置,如在 android{}
中配置 compileSdk 等参数,其本质上是在 gradle 脚本中使用闭包方式创建一个 javaBean,并将其传递到插件中。
创建扩展属性步骤:
- 创建一个实体类,声明成员变量,用于接收 gradle 中配置的参数
class QtExtension {
String name = ""
int age = 0
boolean enabled = false
List<String> include
QtExtension() {}
@Override
String toString() {
return "name=$name, age=$age, enabled=$enabled, include=$include"
}
}
- 在自定义插件中,对当前 project 进行扩展
class QtCustomExt implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("qtExt", QtExtension) // 应用自定义扩展
}
}
- 在 build.gradle 中配置参数(前提当然要先 apply plugin)
qtExt {
name "bqt"
age 30
enabled true
include = ["baiqiantao", "bqt", "白乾涛"]
}
- 获取配置的参数
import com.qt.plugin.extensions.QtExtension
tasks.register('qtTestExt') {
group = "qtPlugin"
description = "测试 Extension"
doLast {
QtExtension qtExt = project.extensions.qtExt
if (qtExt != null) {
println(qtExt.toString())
}
}
}
name=bqt, age=30, enabled=true, include=[baiqiantao, bqt, 白乾涛]
扩展 Task
创建扩展 Task 只需要两步:
- 继承
DefaultTask
,定义一个使用@TaskActions
注解的方法
class QtCustomTask extends DefaultTask {
QtCustomTask() {
group QtUtils.QT_TASK_GROUP
description '自定义 Task'
}
/**
* 使用 @TaskAction 注解定义任务的具体逻辑
*/
@TaskAction
void qtPerformTask() {
//...
}
}
- 在一个 plugin 中注册上面的 Task
class QtRegisterTask implements Plugin<Project> {
void apply(Project project) {
project.tasks.register("qtCustomTask", QtCustomTask) // 注册扩展 Task
}
}
2020-04-08
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/12657397.html