- 前言
Gradle 插件打包了可重用的构建逻辑,可在许多不同的项目和构建中使用。Gradle允许您实现自己的插件,因此您可以重复使用构建逻辑,并与他人共享。
以下是如何创建Plugin的具体流程
- 开发工具
Android Studio 3.6.3
Gradle 5.6.4
Groovy语言
- Gradle Plugin 的打包方式
-
- 构建脚本:插件逻辑写在 build.gradle 中,适用于逻辑简单的任务,但是该方式实现的插件在该构建脚本之外是不可见的,只能用于当前脚本。在这里不做介绍
-
buildSrc项目:该目录buildSrc被视为包含的构建。发现目录后,Gradle会自动编译并测试此代码,并将其放入构建脚本的类路径中。对于多项目构建,只能有一个buildSrc目录,该目录必须位于根项目目录中。 buildSrc应该比脚本插件更可取,因为它更易于维护,重构和测试代码。
- 独立项目:您可以为插件创建一个单独的项目。这个项目产生并发布了一个JAR,您可以在多个版本中使用它并与他人共享。通常,此JAR可能包含一些插件,或将几个相关的任务类捆绑到一个库中。或两者的某种组合。
- 构建脚本
创建一个简单的插件
build.gradle class JYTPlugin implements Plugin<Project> { void apply(Project project) { println("========================"); println("hello JY Test plugin!"); println("========================"); } } apply plugin: JYTPlugin
- 创建一个buildSrc模块
复杂的构建逻辑通常很适合作为自定义任务或二进制插件进行封装。自定义任务和插件实现不应存在于构建脚本中。buildSrc只要不需要在多个独立项目之间共享代码,就可以非常方便地使用该代码。
该目录buildSrc被视为包含的构建。发现目录后,Gradle会自动编译并测试此代码,并将其放入构建脚本的类路径中。对于多项目构建,只能有一个buildSrc目录,该目录必须位于根项目目录中。 buildSrc应该比脚本插件更可取,因为它更易于维护,重构和测试代码。
buildSrc使用适用于Java和Groovy项目的相同源代码约定。它还提供对Gradle API的直接访问。其他依赖项可以在专用的build.gradle下声明buildSrc。
我们看一下如何在Android Studio 中创建一个buildSrc 模块 并书写插件
1. 首先,我们使用Android Studio 创建一个 Project 。
2. 因为Android Studio 并没创建插件的模版,所以我们使用Android Library Module,并且命名Module 的名称为buildSrc,这里有个坑,文件夹的名字大小写必须匹配,不然的话编译的时候,Android Studio 会提示你“Duplicate root element buildSrc”
注:因为android studio 会自动小写你的Module Name ,需要手动修改下
3. 创建完成后,将src/mian下面的东西删除掉,清理掉build.gradle的内容,
生成后的目录结构大概的情况如下
4. 由于gradle是基于groovy
,因此,我们开发的gradle插件相当于一个groovy项目。所以需要在main目录下新建groovy
目录,这时候groovy文件夹会被Android识别为groovy源码目录,代码的部分有了,还需要配置文件的位置,需要在要在main目录下新建resources
目录,相似的resources目录会被自动识别为资源文件夹,resources的目录的固定结构是resources/META-INF/gradle-plugins/xxx.properties ,
有人会问了。为什么叫gradle-plugins,而不是gradle-plugin,难道下面可以配置多个?是的,下面可以配置多个,下面会说明properties文件的作用,理解了作用,你就会知道为什么会是s了
下图是生成的目录结构
5. 修改配置build.gradle
plugins { id 'groovy' } dependencies { implementation gradleApi() implementation localGroovy() }
6. 编写插件
创建文件groovy文件,本次创建的是JYTPlugin.groovy
package com.jykit.plugin import org.gradle.api.Plugin import org.gradle.api.Project class JYTPlugin implements Plugin<Project> { void apply(Project project) { println("========================"); println("hello JY Test plugin!"); println("========================"); } }
7. 配置插件
插件已经开发完了,如何才能外面的人知道尼?如何才能被其他人使用尼?白话描述为,你叫啥?
我们在上面目录结构的时候已经提到过配置文件是在放在resources/META-INF/gradle-plugins下的,我们需要在这个目录下创建一个properties文件,这个文件的名字就是你插件的名字,这个文件里面的内容就是你插件的实现的类关联,比如我们将我的插件命名为:JYTPluginName ,所以的我文件的名字叫JYTPluginName.properties,文件的内容配置为关联方法
implementation-class=com.jykit.plugin.JYTPlugin
看下效果图
7. 关联使用
插件的配置已经完成,如果使用尼?
我们只需要在App的build.gradle中调用就可以了。
apply plugin: 'com.android.application' apply plugin: 'JYTPluginName' #JYTPluginName 这个名字就是我们创建的JYTPluginName.properties 配置文件的名字 ... ...
8. 看下效果
好了,我们已经完成了一个buildSrc Module的简单开发,看下编译一下app项目,看下效果
> Task :buildSrc:compileJava NO-SOURCE > Task :buildSrc:compileGroovy UP-TO-DATE > Task :buildSrc:processResources UP-TO-DATE > Task :buildSrc:classes UP-TO-DATE > Task :buildSrc:jar UP-TO-DATE > Task :buildSrc:assemble UP-TO-DATE > Task :buildSrc:compileTestJava NO-SOURCE > Task :buildSrc:compileTestGroovy NO-SOURCE > Task :buildSrc:processTestResources NO-SOURCE > Task :buildSrc:testClasses UP-TO-DATE > Task :buildSrc:test NO-SOURCE > Task :buildSrc:check UP-TO-DATE > Task :buildSrc:build UP-TO-DATE > Configure project :app ======================== hello JY Test plugin! ======================== CONFIGURE SUCCESSFUL in 3s CONFIGURE SUCCESSFUL in 126ms
- 独立项目编译
为什么要创建独立的项目?难道直接使用buildSrc方式创建不香吗?
buildSrc的方式是便于调试和项目内部使用,如果说外部项目想要使用你的Plugin就需要重新再项目下去创建buildSrc,这样如果有问题需要版本修复的话,就难以统一管理了,所以Gradle 提供了一个插件管理的方法,下面我们动手看下如何创建一个独立的项目编译
创建独立项目的优点
1. 插件名字自定义,
2. 可以统一进行版本管理
1. 创建一个Android Plugin Module,创建方法和上面创建buildSrc的方法类似,只是项目的名称可以自定义,无需强制使用buildSrc,我们参照上面创建buildSrc的方法创建了一个JYTAlonePlugin
2. 编写build.gradle
plugins { id 'groovy' id 'maven' } dependencies { implementation gradleApi() implementation localGroovy() }
3. 编写插件
package com.jykit.plugin import org.gradle.api.Plugin import org.gradle.api.Project class JYTAlonePlugin implements Plugin<Project> { void apply(Project project) { println("========================"); println("hello JY Alone Test plugin!"); println("========================"); } }
4. 编写配置文件
创建JYTAlonePluginName.properties并配置
implementation-class=com.jykit.plugin.JYTAlonePlugin
看下整体的效果
是不是很熟悉?没错,现在的步骤和创建buildSrc的东西都一样,只是Plugin的名字有差别而已
5. 接下来,我们来配置打包,将我们的插件进行发布
我们只需要在Module下的build.gradle后面填写一些配置就可以了
-
- goup插件的分组配置说明
- version 插件的版本管理
- 上传的Task
group 'com.jykit.plugin.JYTAlonePlugin' #包名 version '1.0.0' #版本号 repositories { mavenCentral() } uploadArchives { #打包的Task repositories { mavenDeployer { //提交到远程服务器: // repository(url: "http://www.xxx.com/repos") { // authentication(userName: "admin", password: "admin") // } //本地的Maven地址设置为 repository(url: uri('/Users/mac/.gradle/repos')) } } }
好了,我们配置好了,repository(url: uri('/Users/mac/.gradle/repos'))这里就写明了我们的插件的本地位置,我们可以打开Gradle的编译菜单
我们就可以看到uploadArchives的Task了,执行下,等待结果。
> Task :jytaloneplugin:compileJava NO-SOURCE > Task :jytaloneplugin:compileGroovy UP-TO-DATE > Task :jytaloneplugin:processResources UP-TO-DATE > Task :jytaloneplugin:classes UP-TO-DATE > Task :jytaloneplugin:jar UP-TO-DATE > Task :jytaloneplugin:uploadArchives BUILD SUCCESSFUL in 544ms 4 actionable tasks: 1 executed, 3 up-to-date 3:51:54 PM: Task execution finished 'uploadArchives'.
可以看到,我们已经执行成功了,再去我们的配置的本地路径去看下
我们的插件已经生成成功了。
6. 使用插件
使用插件也比较简单,可以参照android studio的自有插件的写法配置下
在Project的build.gradle 中告知编译器,我需要使用本地仓库查找插件,并告知依赖的插件的名字
buildscript { repositories { google() jcenter() // 告知编译器,我需要使用本地仓库的位置 maven { url uri('/Users/mac/.gradle/repos') } } dependencies { classpath 'com.android.tools.build:gradle:3.6.3' //链接我的插件,其中 com.jykit.plugin.JYTAlonePlugin 为之前创建的group的名字 // jytaloneplugin 为你的Moudel的名字 // 1.0.0 为配置的version classpath 'com.jykit.plugin.JYTAlonePlugin:jytaloneplugin:1.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
配置完了如上配置,你可以编译一下工程,细心的同学会发现,你的的编译器中会显示在现在这个插件
在需要使用app的build.gradle 中就可以配置这个Plugin的使用啦
apply plugin: 'JYTAlonePluginName' //JYTAlonePluginName 是你的配置JYTAlonePluginName.properties文件的名字
OK ,我们去编译一下Project,看下效果
> Task :buildSrc:compileJava NO-SOURCE > Task :buildSrc:compileGroovy UP-TO-DATE > Task :buildSrc:processResources UP-TO-DATE > Task :buildSrc:classes UP-TO-DATE > Task :buildSrc:jar UP-TO-DATE > Task :buildSrc:assemble UP-TO-DATE > Task :buildSrc:compileTestJava NO-SOURCE > Task :buildSrc:compileTestGroovy NO-SOURCE > Task :buildSrc:processTestResources NO-SOURCE > Task :buildSrc:testClasses UP-TO-DATE > Task :buildSrc:test NO-SOURCE > Task :buildSrc:check UP-TO-DATE > Task :buildSrc:build UP-TO-DATE > Configure project :app ======================== hello JY Alone Test plugin! ======================== CONFIGURE SUCCESSFUL in 2s CONFIGURE SUCCESSFUL in 109ms
关于网络的maven仓库或者在本地创建http的仓库,可以参照Nexus搭建
以上是为了学习记录使用