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引入。
//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来寻求帮助
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运行发布。
//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'