gradle插件开发-——基础篇(原创)

gradle插件开发-——基础篇

本篇主要讲两部分内容,插件的开发和插件的使用(引用请注明地址:gradle插件开发-——基础篇(原创) - 简书 (jianshu.com)
):

一、插件的使用

可查看官方文档使用 Gradle 插件Maven 发布插件 (gradle.org)开发自定义 Gradle 插件,gradle7.0之后,使用插件,需要先在settings.gradle文件中的repositories下声明要引入的插件所在的maven地址(url可以是本地maven或者其他maven地址),需要在plugins下声明要引入的插件和版本。如下示意:

//settings.gradle

pluginManagement {
    repositories {
        google()
        mavenCentral()

    //要引入的maven插件的地址
        maven {
            url 'mlocalPlugins'
        }
        
        //引入本地电脑.m2仓库中的maven依赖
        //mavenLocal()

        gradlePluginPortal()
    }

    //在plugins中声明,要引入的插件和版本号,这个步骤不是必须的
    plugins{
        id 'top.lyoun.mplugin.LookPlugin' version '1.0'
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()

        //这里也同样需要引入目标maven插件的地址,否则build项目时,其他build.gradle文件中的dependencies会提示找不到依赖的插件目录
        maven {
            url 'mlocalPlugins'
        }
        //mavenLocal()

    }
}

然后在需要使用该插件的module的build.gradle文件中引入插件,通过plugins下引入。如下示意:

//build.gradle

plugins {
    id 'com.android.application'
    
    //引入自己需要的插件,若前面settings中未定义插件版本号,此处需要用version声明一下插件版本号
    id 'top.lyoun.mplugin.LookPlugin'
    //下面buildSrc项目中生成的插件,引入时可以不带版本号
    id 'top.lyoun.gretting'
    id 'ABSM-plugin'
}

dependencies {
   ...
    //在dependencies中引入该插件依赖,注意这里不是top.lyoun.mplugin.LookPlugin
    implementation 'top.lyoun.mplugin:MPlugin:1.0'
   ...
}

二、插件的开发

1、module内部插件开发

可直接在对应module的build.gradle文件中自定义插件,并引入使用(只能module内部使用,其他module或项目无法使用)。示意如下:

//build.gradle

//自定义的插件
class MPlugin1 implements Plugin<Project>{

    @Override
    void apply(Project project) {
        project.task("helloAndroidLib").doLast({
            //打印一句话,在执行对应的task时会打印
            println("hello from MPlugin1 helloAndroidLib")
        })
    }
}

apply plugin: MPlugin1

2、项目Project内部插件开发

可以定义能被整个项目依赖的插件(只能在项目内用,无法提供给其他应用使用),需要在项目新建buildSrc目录(这个目录名称是定死的,具体原因看gradle官方文档),然后在里面写插件。主要分为下面4个步骤:

  • 通过androidstudio新建java lib module,然后修改settings.gradle文件,把底下的 include ':buildSrc' 去掉,然后Sync同步一下gradle,会自动生成buildSrc的build.gradle文件和buildSrc/main/java路径,自定义的插件需在这个路径下的包下进行定义。

  • buildSrc仅支持javaLib(或kotlin,groovy) ,不支持androidLib,build.gradle文件中的plugins下可以使用的id有 id 'java-library' 或 id 'java-gradle-plugin' ,不能使用id 'com.android.library' 或者 id 'com.android.application'。

  • 在buildSrc/main/java路径的包下定义插件,定义方式可参考上面module内部的自定义插件。

  • 对外公布插件,可以有两种方式,第一种:直接在buildSrc.gradle文件中定义gradlePlugin plugins 下声明对外发布的插件id和插件的路径(包名+类名);第二种:在buildSrc中新建resources文件夹,然后在里面建立 META-INF/gradle-plugins 文件夹,然后在里面新建对外发布插件的 xxid.properties 文件,其中xxid就是你要对外公布的插件名称,在.properties文件中声明插件的路径 implementation-class=插件的包名+类名。注意,xxid和gradlePlugin plugins下声明的插件id不能重复,但是他们可以使用不同的id同时存在,并能被其他module引入。

image.png
image.png
//build.gradle

plugins {
    //id 'com.android.library'
    id 'java-gradle-plugin'
}

gradlePlugin{
    plugins{
        //myPlugins名称任意
        myPlugins{
            id = 'ABSM-plugin' //id指向的就是发布的插件id,其他module就是通过这个id引入插件
            implementationClass = 'top.lyoun.buildsrc.GrettingPlugin'
        }
    }
}
//resources/META-INF/gradle-plugins
// top.lyoun.gretting.properties  //其中top.lyoun.gretting就是对外公布的插件id,其他module可通过这个id引入插件

implementation-class=top.lyoun.buildsrc.GrettingPlugin
//GrettingPlugin.java

package top.lyoun.buildsrc;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;

public class GrettingPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        //AMTak1 即自定义的task名称,同步项目后可在对应module下的tasks下的other下找到,双击即可运行
        project.task("AMTak1").doLast(new Action<Task>() {
            @Override
            public void execute(Task task) {
                System.out.println("=====welcome from AMTak1");
            }
        });
    }
}

//也可通过androidstudio的console控制台,输入 ./gradlew -q AMTak1 来指向对应的task , 
//还可以输入 ./gradlew -h来寻求帮助
image.png

3、独立的插件项目开发

可专门定义一个module来开发插件,不仅项目内能用,还可以发布到maven仓库,供其他应用使用。开发主要分为如下5个步骤:

  • 通过androidstudio新建java lib module,修改他build.gradle文件中的plugins id为java-gradle-plugin,并添加 id 'maven-publish' 用于发布插件。

  • 在build.gradle中声明该插件的group组织名和version版本名。

  • 在gradlePlugin plugins下定义对外发布插件的插件id和该插件的路径(包名+类名)。

  • 在publishing repositories下声明该插件要发布去的maven地址(url可以指向本地地址或者远程maven http地址)。

  • Sync同步gradle,在对应module的Tasks下的publishing下双击运行publish,生成和发布对应的插件。

    • 生成插件后,会在对应目录中找到两个插件,一个是在gradlePlugin plugins下定义的top.lyoun.mplugin.LookPlugin,他底下有生成.gradle.plugin文件夹,他用于settings.gradle和build.gradle文件中的plugins id引入。另外还有一个插件的名称,是以默认的工程Module来命名的,比如top.lyoun.mplugin.MPlugin,注意该plugin是在dependencies下使用的,用于引入依赖。两个插件的用途不一样,引入的位置不一样,但是他们都是有用的,需要搭配使用。

    • publishing task下publishToMavenLocal可以将该插件发布到本地电脑上.m2 maven仓库中,路径一般为:C:\Users\Lyoun.m2\repository\插件包名,一般是插件包名称的第一个.之前的字符,比如 com. ,top.等。

    • 注意publishToMavenLocal并不需要单独配置url指向,与publish发布插件两者并不冲突,但两者并没有包含关系,需要单独点击对应的task运行发布

image.png
image.png
image.png
//build.gradle

plugins {
    id 'java-gradle-plugin'
    id 'maven-publish'
}

group = 'top.lyoun.mplugin' //插件组名
version = '1.0' //插件版本

gradlePlugin{
    plugins{
        //lookPlugin 任意名字都可以
        lookPlugin{
            id = group + '.LookPlugin' //插件id,供外部引用
            implementationClass = 'top.lyoun.mplugin.LookPlugin'
        }
    }
}

//发布插件到maven仓库
publishing{
    repositories {
        //maven仓库地址,url可以指向本地,也可以指向远程maven仓库的http地址
        maven {
            url = '../mlocalPlugins'
        }
    }
}
//LookPlugin.java

package top.lyoun.mplugin;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;

public class LookPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.task("ALookPlugin").doLast(new Action<Task>() {
            @Override
            public void execute(Task task) {
                System.out.println("kaka ==> ALookPlugin");
            }
        });
    }
}

三、常见的Plugins id

日常使用比较多的主要有如下几种:

plugins {
    id ..
    id 'maven-publish'
}

//声明项目是一个android application项目
id 'com.android.application'

//声明项目是一个android library项目
id 'com.android.library'

//声明项目是一个java library项目
id 'java-library'

//声明项目是一个Plugin插件项目
id 'java-gradle-plugin'

//发布插件用的
id 'maven-publish'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容