End

开发 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

配置

  • 在 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

posted @ 2020-04-08 00:47  白乾涛  阅读(948)  评论(0编辑  收藏  举报