这是我参与更文挑战的第7天,活动详情查看:更文挑战
前言:
前几篇文章循序渐进的说明了gradle, 从认识gradle到编写gradle的task以及从groovy转换成kotlin编写gradle,现在我们开始编写一个自定义的plugin并被项目依赖
包管理buildSrc
- 这篇文章不会详细讲解buildSrc!!会专门写一篇文章来说明buildSrc和Composing builds
- 简单说一下,我们在实现一个app功能时可能会分若干个module,而每个模块都有各自的依赖,这其中多个模块可能会有相同的依赖,而我们就需要一个统一的模块版本管理,早期我们可能会在根目录下创建一个config.gradle 来定义库的版本号,库地址,然后在各个module中进行引用,而现在我们会使用buildSrc插件进行管理,使用buildSrc管理的好处是全局都能用并且只有一个地方可以修改它,可以通过点击跳转到设置参数,但是每次依赖更新将重新构建整个项目,在进行小的增量更改时可以使用– –no-rebuild 进行构建,Composing builds也可以解决此问题,编译更省心。我们先使用buildSrc,在buildSrc中新建插件。
自定义插件
我们学习gradle最终目的就是为了自己能写出插件来解决现实项目中的问题。gradle自定义非常广泛,插件化,热修复,性能优化,指标检测,多渠道打包等等都会用到Gradle插件。
自定义Gradle插件的方式有三种,代码都差不多,都是必须实现Plugin这个接口,然后实现接口中的apply方法。只不过写的地方不一样。(我们是使用kotlin编写所以扩展名都为.kts)
- 第一种在build.gradle.kts
class MyPlugin : Plugin<Project> {
@Override
fun apply(target: Project) {
println("MyPlugin执行了")
target.task("mytask") {
doLast {
println("MyPlugin中的task执行了")
}
}
}
}
复制代码
定义一个MyPlugin插件实现Plugin接口。然后在apply方法中自定义一个task。一个简单的插件就完成了。
然后在当前build.gradle文件中引入插件
然后在控制台执行一下我们自己的task,window下命令:gradlew -q mytask 输出如下
Configure project :app
MyPlugin执行了
Task :app:mytask
MyPlugin中的task执行了
复制代码
使用这种方式可以很快的创建一个插件,不过缺点也很明显:
该plugin只能被当前build.gradle引用。
一个插件不可能就上面那几行代码,插件代码全写到这一个文件中,会让这个文件非常臃肿不好维护。
- 第二种在buildSrc文件夹下(重点说明这个)
buildSrc是Gradle中的默认插件目录,编译的时候Gradle会自动识别这个目录,将其内的代码编译成插件。
首先在buildSrc新建一个目录src/main/kotlin
在kotlin目录下新建自己的插件包名:我们新建一个PluinTest.kt类实现Plugin接口重写apply方法
在apply方法中实现自己的插件下面我们简单写一个插件:
package com.gavindon.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* description:
* Created by -- on 2021/6/25 16:15
*/
class PluginTest : Plugin<Project> {
override fun apply(target: Project) {
println("MyPlugin执行了")
target.task("mytask") {
doLast {
println("MyPlugin中的task执行了")
}
}
}
}
复制代码
我们现在已经写好了一个简单的插件,现在要让项目找到这个插件,我们需要在buildSrc/build.gradle.kts定义好插件的指向。在gradlePlugin函数中主要配置插件id,implementationsClass 我们就可以找到插件进行使用。
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
google()
}
gradlePlugin {
plugins {
create("myPlugins") {
id = "my-plugin"
implementationClass = "com.gavindon.plugin.PluginTest"
description = "测试插件"
}
}
}
复制代码
我们在app/build.gradle.kts中引入我们在buildSrc/build.gradle.kts下声明的id为“my-plugin”的插件
我们在控制台输出 gradlew -q mytask
至此我们自定义插件就已经完成了,如果想要实现一些复杂的功能,需要我们更进一步了解gradle的api来进行实现.