玩转 Gradle,Plugin本质是什么?剖析个知名插件

作者:CoderPig
链接:
关于Gradle的学习 , 我所理解的流程如下:
1.了解Gradle的本质 , 了解其构建生命周期;
2.熟悉其内部的核心对象 , Projet、Task等等;
3.熟悉Groovy或者kotlin , 可以自己编写一些简单的task;
4.学会自定义GradlePlugin;
5.对Android打包构建过程中 , 涉及到的核心task分析;
剩下的只有多看了 , 会在各种开源plugin或者博客中看到各种小技巧 , 然后在不断的「还能这么写?」「我* , 这也可以」「可以 , 学到了」中成长 , 增加个人解决问题的技巧与方式 。
本文大概属于环节4 , 对于后续更深入的打包源码分析分享也在路上了 , 好了看文吧~
在这一篇《补齐Android技能树-玩转Gradle(二)》提到过插件 , 有下面这样一段话:
Gradle自身并没有提供编译打包的功能 , 它只是一个负责定义流程和规则的框架 , 具体的编译工作都是由插件来完成的 , 比如编译Java用Java插件 , 编译Kotlin用Kotlin插件 。 插件的本质就是:定义Task , 并具体执行这些Task的模板 。
Gradle自身并没有提供编译打包的功能 , 它只是一个负责定义流程和规则的框架 , 具体的编译工作都是由插件来完成的 , 比如编译Java用Java插件 , 编译Kotlin用Kotlin插件 。 插件的本质就是:定义Task , 并具体执行这些Task的模板 。
本节就来了解下:Gradle插件编写的知识储备及插件发布相关姿势 , 读者亦可自行查阅官方文档Packagingaplugin:
Gradle插件本质上是一个jar文件 , 可以用idea创建项目 , 也可以使用gradleinit命令创建 , 示例如下:
玩转 Gradle,Plugin本质是什么?剖析个知名插件
文章图片
Tips:选择kotlin、Java、Kotlin实现都可 , 脚本DSL选kotlin、Kotlin皆可 , 笔者都用的kotlin~
1
Gradle插件分类
玩转 Gradle,Plugin本质是什么?剖析个知名插件】1.构建脚本
严格来说不上插件 , 就是把构建脚本代码写到一个单独的文件中 , 复制粘贴到项目目录下引用 。 示例如下:
外部构建脚本:other.gradle
//脚本内部访问
defversionName="v1.0.0"
defversionDesc="第一个版本"
//脚本外部访问
ext{
author="CoderPig"
}
//Task任务
taskprintVersionInfo{
doLast{
println"$versionName→$versionDesc"
}
}
build.gradle中引用此脚本:
applyfrom:'other.gradle'
tasktest{
dependsOn(printVersionInfo)
doFirst{println(author)}
doLast{println("build.gradle里的task")}
}
键入gradletest执行任务结果输出如下:
玩转 Gradle,Plugin本质是什么?剖析个知名插件
文章图片
2.buildSrc项目
执行Gradle时会将根目录下的buildSrc目录作为插件源码目录进行编译 , 并将结果加入到构建脚本的classpath中 。
这种插件不需要plugins{}引入 , 一般适合没有复用性的插件或者新插件开发调试用 , 还有个缺点:无法使用属性配置DSL , 需通过configure{...}配置插件属性 。
3.独立项目
将项目打成jar包 , 可在多个项目间复用 , 一般的插件开发都是指的这一类~
2
GradlePluginDemo初体验
我们上面通过命令行创建了一个Gradle插件项目 , 接着来康一康都有哪些核心要素(顺带吐槽下网上一堆说得不清不楚的文章...)
1.项目组成
①插件实现类:CpPluginPlugin.kotlin
packagecn.coderpig.plugins
importorg.gradle.api.Project
importorg.gradle.api.Plugin
publicclassCpPluginPluginimplementsPlugin{
publicvoidapply(Projectproject){
//注册一个Task
project.tasks.register("greeting"){
doLast{
println("Hellofromplugin'cn.coderpig.plugins.greeting'")