个人博客
自定义Gradle插件
自定义Gradle插件可以分三种
-
定义在具体的Module对应的gradle文件里。这种方式定义的插件只能在定义的Module中使用
-
定义名为BuildSrc的Module,在BuildSrc里定义。这种方式定义的插件只能在同一个工程中使用。
-
定义其它名字的Module,在新定义的Module里定义插件。这种方式定义的插件可以给第三方使用。
下面针对这三种方式,以开发一个可以让用户自定义配置的插件为例,分别来展开具体的定义插件过程
定义在Gradle文件里
定义
在app模块下的gradle文件中,增加定义
class CustomInnerConfig {
String key
}
//定义extension
extensions.create("customInnerConfig", CustomInnerConfig.class)
task("CustomInnerTask", group: 'CustomTask').doLast {
println("CustomInnerTask,key=${customInnerConfig.key}")
}
同步项目后,可以在Android Studio右侧的gradle面板中看到新增加的插件
使用
自定义配置
customInnerConfig {
key = 'inner key'
}
在gralde面板中,找到CustomInnerTask,双击运行
输出结果如下,可以看到自定义的配置已经生效:
Parallel execution with configuration on demand is an incubating feature.
:app:CustomInnerTask
CustomInnerTask,key=inner key
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
10:56:44: Task execution finished 'CustomInnerTask'.
在BuildSrc模块中定义
定义
新建名为BuildSrc的模块,删除BuildSrc模块下其它文件,只保留build.gradle。配置build.gradle文件如下:
apply plugin: 'groovy'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
同步后,新建src/main目录
在main目录下新建groovy文件夹
然后在groovy文件夹下新建目录:com/wangyz/local
在local目录下新建CustomLocalConfig.java文件,内容如下:
package com.wangyz.local;
public class CustomLocalConfig {
String key;
}
在local目录下新建LocalPlugin.groovy文件,内容如下:
package com.wangyz.local
import org.gradle.api.Plugin
import org.gradle.api.Project
class LocalPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create("setting", Setting)
project.task('CustomLocalTask', group: 'Custom').doLast {
println "自定义LocalTask,versionName:${project.setting.versionName}"
}
}
}
使用
在app模块下的gradle文件中引入刚才定义的插件
apply plugin: com.wangyz.local.LocalPlugin
同步后,gradle面板如下
自定义配置
customLocalConfig{
key = 'local key'
}
双击CustomLocalTask,执行结果如下
CustomLocalTask,key=local key
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
11:20:47: Task execution finished 'CustomLocalTask'.
定义可供第三方使用的插件
定义
新建名为Plugins的模块,删除Plugins模块下src/main其它文件。配置build.gradle文件如下:
apply plugin: 'groovy'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
在main目录下新建groovy文件夹
然后在groovy文件夹下新建目录:com/wangyz/plugins
CustomConfig.java文件,内容如下:
package com.wangyz.plugins;
public class CustomConfig {
String key;
}
在plugins目录下新建CustomPlugin.groovy文件,内容如下:
package com.wangyz.plugins
import org.gradle.api.Plugin
import org.gradle.api.Project
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project){
project.extensions.create("customConfig", CustomConfig)
project.task('CustomTask', group: 'CustomTask').doLast {
println "CustomTask,key=${project.customConfig.key}"
}
}
}
在Plugins模块的src/main目录下新建resources/META-INF/gradle-plugins目录,在目录下新建名为com.wangyz.plugins.CustomPlugin.properties的文件,文件名即为第三方引用的插件名称。文件内容为:
implementation-class=com.wangyz.plugins.CustomPlugin
在这个文件里配置了之前定义的CustomPlugin的路径
发布插件
在Plugin模块的build.gradle文件中增加以下配置
apply plugin: 'maven-publish'
publishing{
publications{
mavenJava(MavenPublication){
groupId 'com.wangyzs.plugin'
artifactId 'CustomPlugin'
version '1.0.0'
from components.java
}
}
}
publishing{
repositories {
maven{
url uri('D:\Repository')
}
}
}
同步后,在Terminal面板执行gradle publish命令,然后在D:Repository下可以找到生成的插件
引入插件
在工程的build.gradle文件中增加
repositories {
//...
maven{
url uri('D:\Repository')
}
}
dependencies {
//...
classpath 'com.wangyz.plugins:CustomPlugin:1.0.0'
}
在需要引入的模块的build.gradle中增加
apply plugin: 'com.wangyz.plugins.CustomPlugin'
customConfig{
key = 'custom key'
}
同步后,在gradle面板双击CustomTask运行
输出结果:
CustomTask,key=custom key
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
13:02:48: Task execution finished 'CustomTask'.
源码地址:https://github.com/milovetingting/Samples/tree/master/GradlePlugin