Gradle作为项目的构建方式,起着很重要的作用,而我们在开发中却基本很少深入的了解它,这篇文章就记录下在学习插件开发过程的笔记。插件开发的基础是task,对于task的学习,可以看任玉刚的这篇文章,基本的使用介绍得很清楚。
Gradle插件分为脚本插件
和对象插件
,下面来分别看下两者的使用
脚本插件
脚本插件就是在普通的gradle中写一系列task,然后在别的gradle构建脚本中通过 apply from: 'xx.gradle'
引用这个脚本插件
首先在根目录中创建config.gradle文件,在里面定义好一个task
project.task("showConfig") {
doLast {
println("$project.name:showConfig")
}
}
然后我们在项目的gradle中引入
apply from: 'config.gradle'
接着就可以通过gradlew执行这个task了
gradlew showconfig
运行结果
> Task :showConfig
GradleDemo:showConfig
对象插件
对象插件是指实现了org.gradle.api.Plugin
接口的类。并且需要实现void apply(T target)
这个方法,该方法中的泛型指的是此Plugin
可以应用到的对象,而我们通常是将其应用到Project
对象上。
编写对象插件常见创建方式
1 .直接在gradle脚本文件中
2 .在buildSrc目录下
3 .在独立的项目下
gradle中直接创建
gradle里面创建比较简单,直接实现类接口
//app.gradle
class CustomPluginInBuildGradle implements Plugin<Project> {
@Override
void apply(Project target) {
target.task('showCustomPluginInBuildGradle'){
doLast {
println("task in CustomPluginInBuildGradle")
}
}
}
}
然后通过插件类名引用它
//app.gradle
apply plugin: CustomPluginInBuildGradle
接着就可以直接执行这个task了
运行结果
> Task :app:showCustomPluginInBuildGradle
task in CustomPluginInBuildGradle
buildSrc目录中创建
buildSrc目录是Gradle在项目中配置自定义插件的默认目录,里面定义的task可以直接使用,首先我们需要创建一个Java Library Module,名字叫buildSrc,因为使用的groovy,所以目录下面的java需要修改为groovy,需要通过id符号引入的,也需要创建resources->META-INF->gradle-plugins
修改之后的目录结构
CustomPluginInBuildSrc是定义好的对象插件,resources中定义的内容是为了通过id识别的
package com.gary.plugin
import org.gradle.api.Project
import org.gradle.api.Plugin
class CustomPluginInBuildSrc implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('showCustomPluginInBuildSrc') {
doLast {
println('task in CustomPluginInBuildSrc')
}
}
}
}
tip: 有时候可能不会自动导包,需要手动导入,package也别忘了,否则就会报一些奇怪的错误。
接着看下resources里面的myplugin.properties
implementation-class=com.gary.plugin.CustomPluginInBuildSrc
这其中myplugin是别的gradle构建脚本识别的id,implementation-class需要设置的是全路径名,当然resources目录里面的内容可以不用创建,我们在别的构建脚本中导入的时候,就需要导入全路径名
apply plugin: 'myplugin'
导入之后我们就可以使用buildSrc里面的task了
运行结果
> Task :app:showCustomPluginInBuildSrc
task in CustomPluginInBuildSrc
在buildSrc里面定义的task就可以在不同module中使用,但是不适合在不同project中使用了
在独立的项目中创建
在独立项目中创建和buildSrc中创建是一样的,只不过要使用的话,这个项目需要打包上传,然后在别的项目中引入,这里测试的话,就上传到本地目录中了,上传首先要引入Maven,配置代码如下
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
group = 'com.gary.plugin'
version = '1.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
接着点击这里
接着就会打包项目,上传到项目根目录repo中,上传结果
在项目中就可以通过group:artifact:version方式引入了
buildscript {
//https://docs.gradle.org/current/userguide/custom_plugins.html
repositories {
maven {
url uri('repo')
}
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'com.gary.plugin:alonemyplugin:1.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
然后在module的gradle中引入
apply plugin: 'alonemyplugin'
最后就可以使用在项目中定义的task了。
运行结果
> Task :app:showStandAlonePlugin
task in StandAlonePlugin
总结
1 . 插件分为脚本插件和对象插件。
2 . 脚本插件通过apply from: 'foo.gradle’引用。
3 . 对象插件可以在当前构建脚本下直接编写,也可以在buildSrc目录下编写,还可以在完全独立的项目中编写,通过插件类名或是id引用。apply plugin: ClassName或者apply plugin:‘pluginid’