目录
gradle插件分成脚本插件和对象插件:
- 脚本插件:一个普通的构建脚本,可以导入到其他的构建脚本中。
- 对象插件:实现了org.gradle.api.Plugin接口。
1. 脚本插件
假设我们有一个脚本名为 sayhello.gradle ,它里面有一个task:
task sayHello << {
println 'hello world'
}
然后我们在build.gradle中依赖这个外部脚本,调用Project的apply方法,apply方法调用时传入from属性。
apply from: 'sayhello.gradle'
此时我们运行gradle sayHello 命令,可以看到sayHello 这个task执行了:
:sayHello
hello world
2. 对象插件
有三种形式可以定义对象插件:
- 直接在build.gradle中编写Plugin,这种方式这种方法写的Plugin无法被其他 build.gradle 文件引用。
- 单独的一个Module,这个Module的名称必须为buildSrc,同一个工程中有的构建文件够可以引用这个插件,但是不能被其他工程引用。
- 在一个项目中自定义插件,然后上传到远端maven库等,其他工程通过添加依赖,引用这个插件。
在build.gradle中写Plugin
apply plugin:UserPlugin
// 实现Plugin
class UserPlugin implements Plugin<Project>{
@Override
void apply(Project project){
println "hello"
}
}
创建单独的 "buildSrc" Module
- 创建一个 Module (Phone&Tablet Module 或 Android Librarty 都可以),Module的名称必须为 buildSrc。
- 将Module里面的内容删除,只保留build.gradle文件和src/main目录。
- 我们开发的 gradle 插件相当于一个 groovy 项目。所以需要在 main 目录下新建 groovy 目录。
- 然后创建一个 Java 文件一样的方式创建一个 groovy 文件,比如包名为 com.android.xx 的 TestPlugin.groovy 文件。
因为gradle插件实际上就是groovy项目,所以需要groovy和gradle的sdk,需要在buildSrc下面的build.gradle修改成:
apply plugin: 'groovy'
dependencies {
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
}
repositories {
jcenter()
}
使用这个插件,需要在app的build.gradle添加
apply plugin: com.android.hq.testplugin.TestPlugin
输入 ./gradlew tasks,我们可以看到 testPlugin 已经在task列表中。
上传远端maven仓库
- 创建一个新的 Project。
- 同样创建一个 Module (Phone&Tablet Module 或 Android Librarty 都可以),Module的名称随意。
- 将Module里面的内容删除,只保留build.gradle文件和src/main目录。
- 我们开发的 gradle 插件相当于一个groovy项目。所以需要在main目录下新建groovy目录。
- 然后创建一个 Java 文件一样的方式创建一个 groovy文件,比如报名为 com.android.xx 的 TestPlugin.groovy 文件。
- 现在,我们已经定义好了自己的 gradle 插件类,接下来就是告诉 gradle,哪一个是我们自定义的插件类,因此,需要在 main 目录下新建 resources 目录,然后在 resources 目录里面再新建 META-INF 目录,再在 META-INF 里面新建 gradle-plugins 目录。最后在 gradle-plugins 目录里面新建 properties 文件,注意这个文件的命名,你可以随意取名,但是后面使用这个插件的时候,会用到这个名字。比如,取名为
com.android.xx.properties
,而在其他 build.gradle 文件中使用自定义的插件时候则需写成:apply plugin: 'com.android.xx'
- 然后在
com.android.hq.testplugin.properties
文件里面指明你自定义的类:implementation-class=com.android.hq.testplugin.TestPlugin
- 修改build.gradle: 因为我们要用到 groovy 以及后面打包要用到 maven ,所以在我们自定义的 Module 下的 build.gradle 需要添加如下代码:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
}
repositories {
mavenCentral()
}
- 前面我们已经自定义好了插件,接下来就是要打包到Maven库里面去了,你可以选择打包到本地,或者是远程服务器中。
//group和version在后面使用自定义插件的时候会用到
group='com.android.xx'
version='1.0.0'
uploadArchives {
repositories {
mavenDeployer {
//提交到远程服务器:
//repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
//}
//本地的Maven地址设置为/mnt/TestRepos/
repository(url: uri('/mnt/TestRepos/'))
}
}
}
- 然后通过gradle的uploadArchives就可以执行打包上传下载了。我们可以在对应的文件目录下可以看到对应的jar包。
- 我们可以在Module的build的gradle文件中指定Mavne的地址,自定义插件的名称和依赖包名。
//com.android.hq.testplugin.TestPlugin为resources/META-INF/gradle-plugins 下的properties文件名称
apply plugin: 'com.android.xx'
buildscript {
repositories {
maven {
//本地Maven仓库地址
url uri('/mnt/TestRepos/')
}
}
dependencies {
//格式为-->group:module:version
classpath 'com.android.hq.testplugin:testplugin:1.0.0'
}
}