自己动手写一个插件

如何自己写一个 gradle 插件

看谷歌的插件:com.android.applicationcom.android.databinding

1
2
apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'

他们都是一个 groovy 项目,那么接下来让我们来看看如何自己手动写一个插件:

创建一个普通的 groovy 工程(java 工程也没有关系),创建 src/main/groovy 目录,编写下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
package com.example.wecar.plugin
import org.gradle.api.Plugin
import org.gradle.api.internal.project.ProjectInternal

class GreetingPlugin implements Plugin<ProjectInternal> {

void apply(ProjectInternal project) {
project.task('hello') << {
println 'hello'
}
}
}

在 src/main/resources 创建 META-INF/gradle-plugins 目录,创建 greetings.properties 文件:

1
implementation-class=com.example.wecar.plugin.GreetingPlugin

其中 greettings 就是你的插件 id。

build.gradle

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
group 'com.example.wecar.plugin'
version '1.1-SNAPSHOT'

buildscript {
repositories {
mavenLocal()
}
}

apply plugin: 'groovy'
apply plugin: 'java'

repositories {
mavenCentral()
}

sourceSets {
main {
groovy {
srcDirs = [
'src/main/groovy',
'src/main/java'
]
} // compile everything in src/ with groovy
java { srcDirs = []}// no source dirs for the java compiler

}
}

dependencies {
//tasks.withType(Compile) { options.encoding = "UTF-8" }
compile gradleApi()
}

// custom tasks for creating source jars
task sourcesJar(type: Jar, dependsOn:classes) {
classifier = 'sources'
from sourceSets.main.allSource
}

// add source jar tasks as artifacts
artifacts { archives sourcesJar }

// upload to local
uploadArchives {
repositories{
mavenLocal()
}
}

运行 uploadArchives 发布到本地仓库,那么就可以找到我们自己的插件了,由于当中没有指定 artifactId,那么我们的插件的 artifactId 就是我们的工程名称,比如这里是 deployplugin。

那么我们要怎么引入这个插件呢?

首先要再 buildScript 增加依赖:

1
2
3
4
5
6
7
8
buildscript {
repositories {
mavenLocal()
}
dependencies {
classpath 'com.example.wecar.plugin:deployplugin:1.1-SNAPSHOT'
}
}

然后:

1
apply plugin: 'greetings'

这样我们的 task “hello” 就被引入了。是不是很简单呢~