Gradle插件是什么

Gradle插件将可重复使用的构建逻辑封装起来,可用于许多不同的项目和构建。 Gradle插件就相当于jar包,里面封装了一些共有的方法以及一些自定义的task等。

如何开发Gradle插件

可以使用任何语言开发Gradle插件,只要最终生成字节码就行。一般常用的语言是GroovyJavaKotlin

下面以Groovy语言为例(IDE使用Intellij Idea),介绍Gradle插件开发的流程:

1, 首先需要创建一个工程,然后新建一个名为my-plugin的模块,模块类型选Gradle,语言选择Groovy(如果使用的是Android studio可以新建一个Java模块,然后将main/java/文件夹改名为main/groovy
Alt text

2, 修改build.gradle,增加对gradle sdkgroovy sdk的依赖:

1
2
3
4
5
6
7
8
9
10
// 导入groovy插件,用于编译groovy等
apply plugin: 'groovy'

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// 依赖Gradle sdk,插件开发中需要用到gradle的api
compile gradleApi()
// 依赖groovy sdk
compile localGroovy()
}

3, 准备工作做好后就可以开始编写插件了。在groovy目录下新建名为MyPlugin的类(注意:groovy类文件的后缀是groovy)

1
2
3
4
5
6
7
8
package com.pptv.plugin

class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.tasks.create("my-task")
}
}

自定义插件必须实现Plugin接口,覆盖其apply方法,并在apply方法中完成该自定义插件的功能。上述代码中创建了一个名为my-tasktask,但该task什么也不做。

4, 插件写好后,要想在其他项目或模块中使用该插件,需要先发布插件。

发布插件

1, 首先需要在插件模块的resources目录下新建META-INF/gradle-plugins目录,然后再在gradle-plugins目录下新建一个properties属性文件,文件名称可以任意,但最好与项目功能相关,因为之后会用到这个文件名。然后在该文件中输入:

1
implementation-class=com.pptv.plugin.MyPlugin

其中implementation-class属性的值就是刚才新建的MyPlugin类的类名(带包名)。

2, 在插件模块的build.gradle中新增uploadArchives节点,用于配置发布插件所需的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uploadArchives {
repositories {
// 以下用于将插件发布到本地
flatDir {
name "localRepository"
dir "${getRootDir()}${File.separator}build"
}
// 以下可用于将插件发布到私有maven仓库
maven {
url "http://maven.pptv.com/repositories/"
credentials {
username "${props['MAVEN_REPO_USERNAME']}"
password "${props['MAVEN_REPO_PASSWORD']}"
}
}

// 以下也可用于将插件发布到私有maven仓库, 且可以配置的内容更多些
// apply plugin: 'maven'
// mavenDeployer {
// repository (url:"http://maven.pptv.com/repositories/"){
// authentication (userName:"${props['MAVEN_REPO_USERNAME']}", password:"${props['MAVEN_REPO_PASSWORD']}")
// pom.groupId = "${GROUP_ID}"
// pom.artifactId = project.getName()
// pom.version = "${VERSION_NAME}"
// }
// }
}
}

(完整的build.gradle见文章最后)
其中:

  • flatDir节点用于配置将插件发布到本地时,插件存放的目录(dir) 信息;
  • maven 节点用于配置将插件发布到远端maven仓库,需配置远端仓库的url和账号信息(credentials);
  • 注释掉的mavenDeployer节点也可以用于将插件发布到maven仓库,但这个配置需要依赖maven插件(apply plugin: 'maven')。 其中注释掉的代码中${GROUP_ID}${VERSION_NAME}的定义如下:

    1
    2
    3
    4
    5
    6
    7
    // group id
    def GROUP_ID = "com.pptv.plugin"
    // 版本
    def VERSION_NAME = "1.0.0"

    group "${GROUP_ID}"
    version "${VERSION_NAME}"
  • 具体要将插件发布到本地还是远端,可以自己选择。

使用插件

插件开发完成后,要在其他项目或模块中使用,需要在其他项目的根build.gradle中加入如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
buildscript {
repositories {
// 本地库配置
flatDir {
name "localRepository"
// 本地插件存放的路径
dir "${getRootDir()}${File.separator}build"
}
// 远端库配置
maven {
url "http://maven.pptv.com/repositories/"
credentials {
username "${props['MAVEN_REPO_USERNAME']}"
password "${props['MAVEN_REPO_PASSWORD']}"
}
}
}
dependencies {
// 导入插件库, 格式为 -> group:module:version
classpath "com.pptv.plugin:my-plugin:1.0.0"
}
}

上述配置中:

  • flatDir节点的配置同发布插件的配置,指明了插件在本地存放的位置信息;
  • maven节点的配置同发布插件的配置,指明了远端仓库的url等信息;
  • dependencies节点的classpath属性的取值格式是group:插件module名称:插件版本号version

然后需要在使用插件的模块的build.gradle中添加:

1
apply plugin: 'my-plugin'

其中my-plugin为插件模块resources/META-INF/gradle-pluginsproperties文件的文件名(该名称可以和插件模块的名称不相同)。

刷新下项目,在Gradle视图窗口中就可以看到自定义插件创建的 my-task了:
Alt text

至此,一个简单的Gradle插件就开发完成了。

插件模块完整 build.gradle

参考 : https://docs.gradle.org/current/userguide/userguide_single.html#custom_plugins