gradle 自定义plugin

·  阅读 1085

这是我参与更文挑战的第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

1624615118(1).jpg

在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”的插件

1624616250(1).jpg

我们在控制台输出 gradlew -q mytask

1624615016(1).jpg 至此我们自定义插件就已经完成了,如果想要实现一些复杂的功能,需要我们更进一步了解gradle的api来进行实现.

分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改