自定义Gradle Plugin
Posted 王三的猫阿德
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义Gradle Plugin相关的知识,希望对你有一定的参考价值。
转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/73848633
1. 前言
自定义Gradle Plugin使用的是Groovy语言,和Java很像,很容易理解,不做过多的语言介绍。
2. Gradle Plugin的位置
- 直接在构建文件
build.gradle
中编写Plugin,这种方法写的Plugin无法被其他构建文件引用 - 单独写Gradle Plugin文件,放在
rootProjectDir/buildSrc/src/main/groovy/
目录下,同一个工程中所有的构建文件够可以引用这个插件,但是不能被其他工程引用 - 单独的工程中自定义Gradle Plugin,上传到远端maven库等,其他工程通过添加依赖,引用这个插件
3. 简单的Gradle Plugin示例
自定义插件,需要实现Plugin
接口。在其他工程的构建文件中通过Plugin.apply(T)
方法引用插件,这个工程会被当作参数传入。上面讲了Gradle Plugin可能存在的三种位置,下面是一个简单插件的示例,是直接写在build.gradle
的。
apply plugin: DemoPlugin
// 其他一些工程的配置信息
...
class DemoPlugin implements Plugin<Project>
void apply(Project project)
project.task('hello')
doLast
println "Hello World from the DemoPlugin"
使用gradle -q hello
指令输出如下:
> gradle -q hello
Hello World from the DemoPlugin
因为这个Gradle Plugin是直接写在构建文件build.gradle
里的,所以它不能被其他构建文件引用,下面介绍可被其他工程引用的自定义插件。
4. 自定义插件
想要可以被其他工程引用我们自定义的Gradle Plugin,需要将Gradle Plugin上传到maven等远端库,因为是demo,就将插件发布到本地。一般来说有下面几步。
- 在
rootProjectDir/buildSrc/src/main/groovy/
目录下创建插件,并实现具体内容 - 在
rootProjectDir/buildSrc/src/main/resources/META-INF/gradle-plugins
目录下创建属性文件声明插件的具体实现类,属性文件的名称和Gradle Plugin Id相匹配,内容是implementation-class=具体实现类全称
- 上传mavan等库,这篇文章就不上传到maven库,将插件发布到本地
- 其他工程引用插件
4.1 插件具体实现类
目录结构如下:
图-1 插件目录结构图
插件类具体内容如下:
package com.spi.demo.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
public class DemoPlugin implements Plugin<Project>
void apply(Project project)
project.task('hello')
doLast
println "Hello World from the DemoPlugin"
可以看出其实和Java文件差别不大,这个插件主要申明了一个名为hello
的任务,这个任务只输出一句话。
实现了Gradle Plugin的具体实现类后,在/buildSrc/src/main/resources/
目录下创建属性文件声明Gradle Plugin的具体实现类的位置。属性文件的名称是.propertires,内容是具体实现类的位置,这个demo中属性文件的内容如下:
implementation-class=com.spi.demo.gradle.DemoPlugin
4.2 插件Id
插件Id是自定义的,声明插件Id后,其他工程在构建文件build.gradle
中通过apply plugin: 'Plugin Id'
来引用具体的Gradle Plugin。
插件id类似于java中的包名,可以避免与其他插件发生冲突。
插件id最好是组件命名空间和插件名称的结合,例如,如果有一个名为“foo”的Github账户,他插件被命名为“bar”,插件id可以是com.github.foo.bar
。同样,如果一个叫做baz
的插件开发组织,插件id可以是org.baz.bar
插件。
插件id遵从一下规则:
- 可以包含任何字母和数字,以及“.”和“-”字符
- 必须包含至少一个“.”字符
- 只能使用小写字母
org.gradle
和com.gradleware
不能被使用- 不能以“.”字符开始或者结束
- 不能连续使用“.”字符
尽管插件id和Java包名有些相似,但实际上包名比插件id要详细得多。
4.3 发布插件
在gradle文件或者pom文件引入一个库,需要有groupId、artifactId、version三个属性,根据这三个属性来区分找到唯一的库。
例如:
compile 'com.android.support:appcompat-v7:25.3.1'
这个引用中
com.android.support
是groupId
appcompat-v7
是artifactId
25.3.1
是version
。
同样,在发布插件时候,也需要这三个属性,用于和其他插件做出区分。
在build.gradle
文件内容如下,添加上传任务:
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies
compile gradleApi()
compile localGroovy()
group = 'com.spi.demo'
version = '1.0-SNAPSHOT'
uploadArchives
repositories
mavenDeployer
repository(url: uri('../repo'))
在这里,定义了group
和version
,但是没有定义artifact
,这是因为artifact
默认是这个工程目录名称,这个demo中artifact
就是plugin
。
在uploadArchives
任务中,我们将插件发布到本工程的上一层目录的repo
文件夹中。执行这个任务后,插件会被发布,发布后目录结构如下图。
图-2 本地插件目录结构图
可以直接在终端使用指令执行uploadArchives
任务,可以将plugin目录工程设置成module,使用Android Studio执行任务。
图-3 上传插件任务图
4.4 引用插件
在工程的构建文件build.gradle
中添加依赖,引用插件。
apply plugin: 'com.spi.demo'
buildscript
repositories
maven
url uri('../repo')
dependencies
classpath 'com.spi.demo:plugin:1.0-SNAPSHOT'
添加了构建的依赖库路径,配置了依赖的具体插件名称。然后在任务列表中就可以看见名为hello
的任务。
图-4 引入插件任务图
使用gradle -q hello
指令输出如下:
> gradle -q hello
Hello World from the DemoPlugin
5. 总结
本文没有讲解将插件发布到远端,插件可以发布到lvy仓库、maven仓库、Gradle plugin portal三个地方。
- 发布到lvy仓库的教程参考点击进入详情
- 发布到maven仓库的教程参考点击进入详情
- 发布到Gradle plugin portal教程参考点击进入详情,想要搜索Gradle plugin portal中有哪些插件,查看这里点击进入详情
以上是关于自定义Gradle Plugin的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )
Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )
Android Gradle 插件Gradle 自定义 Plugin 插件 ④ ( 为自定义 Gradle 插件的扩展配置扩展 | 在自定义插件中获取扩展属性 )