首页 > 其他分享 >开发 Gradle 插件

开发 Gradle 插件

时间:2024-02-23 10:22:17浏览次数:20  
标签:插件 plugin gradle bqt 开发 apply Gradle com

目录

开发 Gradle 插件

基础知识

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 一个方法,该方法配置阶段调用,我们可以在该方法中创建任务、创建方法等。

如果自定义的插件仅在自己项目中使用,可以简单定义在 build 脚本文件中或新建 buildSrc 目录。

目录结构

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

2024-2-23

标签:插件,plugin,gradle,bqt,开发,apply,Gradle,com
From: https://www.cnblogs.com/baiqiantao/p/18028913

相关文章

  • stm32单片机扫码设计方案,ESP32蓝牙无线扫码器设计项目硬件套件的实现,一维码二维码识别
    stm32/ESP32(或ESP32C3,ESP32S3)/ESP8266单片机扫码识别设计方案二维码一维码扫描模块开发项目资料程序,轻松实现蓝牙扫码器WiFi无线串口,二维码识别显示器串口输出条码扫描枪扫码枪开发项目套件设计,很适合DIY无需焊接,到手即可开发调试。ESP32,ESP8266等基于arduino库实现,stm32基于......
  • 数学是基础学科,学好了,还需要传承和与时俱进,去开发未解之谜,数学为很多行业赋能
    ......
  • M1 MacOS 配置C++环境时遇到的插件问题
    配置环境参照博客:https://www.cnblogs.com/BYGAO/p/15135609.html遇到问题:在Terminal--ConfigureDefaultBuildTasks--C/C++clang++这一步没有C/C++clang++选项。解决方法:shift+command+p打开搜索框,搜索SettingsSync:ShowSettings在IgnoredExtensions中打......
  • 软件开发工程师,几款常用的APP,你用过几款?最后一个测试网络必备
    作为一名程序员,手机里一定有几个常用的app,下面给大家推荐几款。1.CSDN国内最大编程论坛;虽然有多少人吐槽现在使用csdn就像屎里淘金,但是不得不承认他仍然是大家搜索技术资料、问题的首选。遇到问题打开app搜索,效率更高!https://blog.csdn.net/daocaokafei2.B站B站是一个非......
  • Unity引擎2D游戏开发,场景管理和切换
    需要用到的工具资源打包、远程热更新工具Addressables工具基本操作在Window菜单下方,会有AssetManagement,选择Addressables中的Groups会弹出相关菜单,将其拖入底部工具栏会提示没有创建Addressables的相关配置,则点击CreateAddressablesSettings这时候会在Project中,多出......
  • 测试也能开发 - 点击二级分类实现自动筛选功能
    写在前面怎么来诠释下现在的心情呢?算是比较复杂吧,我也想过关于自己个人问题的事,始终是无解的状态。35岁,变成了一个没有胆量、小心翼翼的年纪,甚至说慎重到说话都要反复思考的程度,先不说内耗问题了,真的就是负能量爆棚了,我有那么一阵极度怀疑自己丧失了和人沟通的能力。今天,我co......
  • 安卓家庭记账本开发笔记7(补2月3日)
    完成收支记录界面的逻辑编写代码如下:packagecom.example.myapplication1;importandroid.os.Bundle;importandroid.view.View;importandroidx.appcompat.app.AppCompatActivity;importandroidx.fragment.app.Fragment;importandroidx.viewpager2.widget.ViewPager2;import......
  • 腾讯云Gradle镜像源——解决下载Gradle文件慢问题
    1.进入到自己工程目录下的wrapper文件夹。2.编辑gradle-wrapper文件使用mirrors.cloud.tencent.com/gradle来代替原来的services.gradle.org/distributions如:distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-6.7.1-all.zip其它源:华为云源:https://mirro......
  • 安卓家庭记账本开发笔记6(补2月2日)
    完成自定义软键盘的绘制和逻辑编写在res文件夹中创建一个文件包命名为xml。在里面创建一个名为key的xml文件,在其中完成自定义软键盘的绘制代码如下:<?xmlversion="1.0"encoding="utf-8"?><Keyboardxmlns:android="http://schemas.android.com/apk/res/android"......
  • 安卓家庭记账本开发笔记5(补2月1日)
    完成自定义软键盘的编写以及软键盘上面的备注和时间在记录页面的代码底下加上下面的代码<android.inputmethodservice.KeyboardViewandroid:id="@+id/frag_record_keyboard"android:layout_width="match_parent"android:layout_height="wrap_content"......