阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680
本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统Gradle:java
Gradle 插件是一个可以将 Gradle 的构建逻辑(build logic)和构建任务(build task)打包到一块儿,以便在多个项目的构建脚本(build.gradle)中应用(apply)的工具。android
例如,build.gradle
构建脚本文件内 apply plugin: 'java'
、apply plugin: 'com.android.application'
中的 java、com.android.application 就是官方提供的 Gradle 插件,经过应用这些插件,能够丰富项目的构建任务与构建逻辑。git
除官方提供的插件外,Gradle 还容许开发者定义本身的 Gradle 插件。开发者能够根据实际需求定义本身的构建逻辑和构建任务,将其打包为 Gradle 插件,从而在多个项目的构建脚本中复用。此外,还能够将自定义的 Gradle 插件发布到 plugin portal或其余仓库中,更为方便的分享给他人使用。github
Gradle 插件对编程语言没有太多限制,只要是可以被编译为 JVM 字节码的编程语言,都能用来编写 Gradle 插件。Gradle-API 的被设计为对 Groovy、Java、Koltin 友好的,一般状况下,使用 Java 或 Kotlin 这类静态类型语言实现的 Gradle 插件的性能要比使用 Groovy 实现的相同常见的性能更好。web
Gradle 做为一个普通的构建工具,自己并不依赖任何可视化 GUI 工具。为简化步骤,本文将采用命令行方式来完成自定义 Gradle 插件的演示。在开始以前,需先将 gradle 命令添加到系统环境变量中。编程
若读者在 IDEA / Android Studio 使用过 gradle ,则可在当前用户目录下找到 gradle 命令,具体路径以下api
/Users/当前用户名/.gradle/wrapper/dists/gradle版本/沙盒路径/gradle版本/bin
C:\Users\当前用户名\.gradle\wrapper\dists\gradle版本\沙盒路径\gradle版本\bin
若读者的电脑中还没有安装 gradle,则可在 Gradle 官方 下载安装。bash
以笔者使用的环境为例,gradle 命令所在目录为架构
将 gradle 命令所在目录添加到环境变量中app
~/.bashrc
中添加在命令行中输入
获得以下输出则表示 gradle 环境设置成功
自定义 gradle 插件能够在如下三个地方建立,分别是:
在 build.gradle
内直接建立 Gradle 插件
优势:
build.gradle
中建立的插件将<u>被自动编译并包含在 classpath 中</u>,使用时无需在构建脚本内指定 classpath缺点:
示例
1. 建立 BuildInDemo
目录
2. 在 BuildInDemo
目录内中新建 build.gradle
文件
使用 tree
命令查看建立后的目录结构,以下所示
3. 在 BuildInDemo/build.gradle
内建立并应用 Gradle 插件,代码以下
4. 构建此 build.gradle
文件
Gradle 构建时将执行 build.gradle
中的代码,当执行到 apply plugin: BuildInPlugin
时,将会调用 BuildInPlugin 的实例方法 apply(Project p)
。所以在构建过程当中,能够看到以下输出,其中第 2 行即为上一步自定义插件中打印的内容,代表插件应用成功
rootProject/buildSrc 文件夹是 Gradle 的预留目录,用来存放当前项目私有 Gradle 插件的源代码与构建脚本
优势:
缺点:
示例
1. 建立 PluginBuildSrcDemo
项目模块
建立 PluginBuildSrcDemo
目录,并在该目录下建立 build.gradle
文件
2. 建立 buildSrc
子模块
2.1 在 PluginBuildSrcDemo
目录下建立 buildSrc
目录
2.2 在 PluginBuildSrcDemo/buildSrc
目录下建立 buildSrc 子模块的构建脚本文件 build.gradle
PluginBuildSrcDemo/buildSrc/build.gradle
的内容以下
2.3 建立 buildSrc 模块的源码目录
2.4 建立插件文件 PluginBuildSrc.kt
PluginBuildSrc.kt
的代码以下
2.5 声明 Gradle 插件的 ID 与实现类
此步骤是可选的:若使用插件 ID 形式应用自定义插件,则必须进行此步骤;若使用插件实现类的形式应用自定义插件,则可跳过此步骤。
完成此步骤的方式有两种,任选其一便可
方式 1. META-INF 方式
建立 PluginBuildSrcDemo/buildSrc/src/main/resources/META-INF/gradle-plugins
目录
在 gradle-plugins
目录下建立 com.example.plugin.properties 属性文件,红色部分表示插件的 ID
属性文件的内容以下,表示插件 ID 为 com.example.plugin 的插件所对应的实现类为 com.example.plugin.PluginBuildSrc
方式 2. java-gradle-plugin 插件方式
java-gradle-plugin 是一个用于开发 Gradle 插件的辅助插件,它内置了不少辅助功能:
gradlePlugin
配置块,可在此处配置插件的 ID 和实现类complile gradleApi()
依赖此处咱们主要使用 gradlePlugin
配置块代替 META-INF
目录下的属性文件。java-gradle-plugin
的使用方式很是简单,只需在 PluginBuildSrcDemo/buildSrc/build.gradle
构建脚本文件中简单配置便可,以下所示。
此时在 PluginBuildSrcDemo 目录下使用 tree
命令,能够看到当前的目录结构以下
3. 在 PruginBuildSrcDemo
项目模块中应用 buildSrc
中声明的 Gradle 插件
在 PluginBuildSrcDemo/build.gradle
构建脚本文件中添加以下代码
应用插件时,指定插件 ID 或指定插件的实现类均可以,但指定插件 ID 的形式更为简短及灵活,在实际开发中也更为常见。
在 PluginBuildSrcDemo
目录下执行 gradle build
命令进行构建,可看到以下输出
其中第 2 行是咱们在 buildSrc 模块中定义的 Gradle 插件所打印日志,代表 buildSrc 模块 中的自定义插件在根项目中已生效。
4. 建立 SubModule
子模块
buildSrc 模块中定义的插件能够在同一项目的任意模块的构建脚本中使用,接下来便演示在 SubModule 子模块中的应用。
4.1 建立 SubModule 目录与构建脚本
PluginBuildSrcDemo/SubModule/build.gradle
的内容以下
4.2 将 SubModule 模块关联到 PluginBuildSrcDemo 项目中
在 PluginBuildSrcDemo
目录下新建 settings.gradle
文件,内容以下
此时在 PluginBuildSrcDemo
目录下使用 tree
命令,能够看到项目当前的目录结构以下
5. 在 SubModule
模块执行构建命令
获得以下输出
采用 buildSrc 模块方式时,Gradle 会妥善处理 buildSrc 模块的构建脚本与源码,并将其添加到当前项目的 classpath 中。但 buildSrc 方式的插件只能在项目内共享与复用,若要在其余项目中使用该插件,还须要再进行下列操做
由于是在其余项目中使用该项目 buildSrc 模块 中的自定义 Gradle 插件,因此 Gradle 的 buildSrc 保留目录优点再也不。若是将模块名由 buildSrc
修改成其余名称,则可将其称为独立的 Gradle 插件模块。
在本小节中,咱们主要学习 gradle 插件的发布与使用。
1. 建立 gradle 插件项目
与 buildSrc 方式相同,先建立构建脚本与自定义插件类
StandaloneDemo/build.gradle
的内容以下
StandaloneDemo/src/main/kotlin/com/example/plugin/StandalonePlugin.kt
的内容以下
2. 将 gradle 插件发布到 maven 仓库
2.1 在 StandaloneDemo/build.gradle
文件中配置发布信息
使用 maven-publish
插件将自定义插件发布到本地 maven 仓库中,以下所示
2.2 使用 publishMavenPublicationToMavenLocal
任务将插件发布到本地仓库
执行以上命令后,gradle 会把 StandaloneDemo
中的代码编译打包后发布到本地 maven 仓库中,本地 maven 仓库一般存放于当前用户目录下,具体路径为
~/.m2/repository
C:\Users\当前用户名\.m2\repository
咱们能够在此目录下看到刚刚发布的插件,以下图所示
3. 在其余项目中使用本地 maven 仓库中的 gradle 插件
3.1 新建 OtherProject
项目
build.gradle
的文件内容以下,相比 buildSrc 方式,应用时多了 11 行的 buildscript 相关的配置信息。
3.2 构建 OtherProject
项目
输入以上命令,获得以下输出
本文演示了 gradle 插件的三种建立方式,相关代码已上传至 github 中,点此便可查看。行文匆忙不免疏忽,若有遗漏还请斧正。