Gradle插件使用在日常开发中已经很熟悉,那么我们怎么去自定义我们的插件?
自定义插件
自定义插件基于源码放置可以分为3种:
一、Build Script方式
这种插件脚本的源码放置在模块内的 build.gradle 中,好处就是插件脚本会被自动编译并添加进模块的 classpath 中,我们完全不用做任何事情。但是,这种插件脚本只能在声明的这个 build.gradle 中使用,其他模块是没办法复用这个插件的。
//app build.gradle
apply plugin: BuildScriptPlugin
class BuildScriptPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
group = "test-plugin"
doLast {
println "Hello"
}
}
}
}
这里group为右侧组名称,向这个组添加一个名为hello的task
优势:
1、在当前build.gradle文件编写,不需要其他配置即可使用
劣势:
1、在一个文件里面写代码多,不易维护
2、插件代码只能在当前文件中生效,无法复用
二、BuildSrc project方式
Gradle插件是使用Groovy进行开发的,而Groovy其实是可以兼容Java的。Android Studio其实除了开发Android App外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。
- 新建一个Android项目。
- 新建一个Android Module项目,类型选择Android Library。
- 将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容。
-
在新建的module中新建文件夹src,接着在src文件目录下新建main文件夹,在main目录下新建groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录。除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录,同理resources目录会被自动识别为资源文件夹。在groovy目录下新建项目包名,就像Java包名那样。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。这样,就完成了gradle 插件的项目的整体搭建,之后就是小细节了。目前,项目的结构是这样的。
buildSrc project
这里说一下各个目录的作用:
[groovy]:
此目录下为插件源码目录
此处测试代码:
CustomPluginTest.groovy
package com.ann
import org.gradle.api.Plugin
import org.gradle.api.Project
class CustomPluginTest implements Plugin<Project> {
@Override
void apply(Project project) {
//增加闭包名称,闭包为customPlugin,是 CustomPluginTestExtension类型,因此CustomPluginTestExtension类型中的JaveBean类型的属性可以任意设置
project.extensions.add("customPlugin", CustomPluginTestExtension)
project.task("showPersonInfo") << {
println("姓名:" + project.customPlugin.name)
println("年龄:" + project.customPlugin.age)
println("地址:" + project.customPlugin.address)
}
}
}
CustomPluginTestExtension.groovy
package com.ann
class CustomPluginTestExtension{
def name = "init"
def age = "init"
def address = "init"
}
[resources]:
此为资源目录,在上图中gradle-plugins文件夹新建了一个ann-test.properties文件,ann-test文件名称也是以后再build.gradle文件中apply plugin: 'ann-test'的名称,如果一个库有多个插件就建立多个此文件
#implementation-class=为固定格式,等号后面是具体类地址
implementation-class=com.ann.CustomPluginTest
[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'
/**
* 编写自定义插件配置
*/
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
[app build.gradle]:
重新编译后,会在app中出现新task:showPersonInfo
优势:插件代码可以被多个libiary使用
劣势:这种适用于只在本项目使用的情况
三、Standalone project 方式
这种方法就是使用单独的一个工程/模块创建我们的 Gradle 插件,这种方法会构建和发表一个JAR文件,可以提供给多工程构建和其他开发者共同使用。然后publish到仓库,通过apply plugin: 'com.android.application' 这种方式使用,实现了多项目,多module复用。
在开发方面和方式二一样,不一样的地方是:
1、module名称可以自定义
2、module的build.gradle 文件中加入发布代码
[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'
/**
* 编写自定义插件配置
*/
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
/**
* 发布配置,这里发布到本地
*/
publishing {
publications {
mavenJava(MavenPublication) {
groupId 'ann.gradle.plugin'
artifactId 'customplugin-extension'
version '1.0.0-SNAPSHOT'
from components.java
}
}
repositories {
maven {
// change to point to your repo, e.g.
url uri('../repo')
}
}
}
编译后,右侧gradle任务栏module【我这里是buildSrc,可以自定义】中会多一个publish,执行此任务,左侧项目中会多一个repo仓库文件夹,
使用:
- 在工程的根目录的 build.gradle 中添加如下内容:
buildscript {
repositories {
maven {
url uri('./repo')
}
}
dependencies {
classpath 'ann.gradle.plugin:customplugin-extension:1.0.0-SNAPSHOT'
}
}
- 然后,在app的 build.gradle 中 apply 这个插件:
apply plugin: 'ann-test'
customPlugin{
name = "bobo"
age = "25"
address = "广东珠海"
}
这里是发布到本地仓库,实际使用当中是发布到外部仓库中,详细就不在这里说。
更多插件发布内容,请查看官网:Maven Publishing