原文发于微信公众号 jzman-blog,欢迎关注交流。java
前面几篇文章学习了 Gradle 基础知识、Groovy 以及 Gradle 任务,能够先阅读前面几篇文章了解 Gradle 相关知识:android
本篇文章主要介绍 Gradle 插件,Gradle 内置了不少经常使用的插件,Gradle 中的插件可在必定的场景中能够帮助咱们提升开发效率,能够经过扩展示有的插件来实现更多功能,好比 Android Gradle 插件就是基于内置的 Java 插件来实现的。api
先来一下 Gradle 插件的做用,主要有如下几个方面:bash
在使用一个插件以前要先使用 Project 的 apply 方法来应用该插件,插件分为二进制插件和脚本插件。微信
二进制插件就是实现了 org.gradle.api.Plugin 接口的插件,每一个 Java Gradle 插件都有一个 plugin id,能够经过以下方式使用一个 Java 插件:网络
apply plugin : 'java'
复制代码
经过上述代码就将 Java 插件应用到咱们的项目中了,其中 java 是 Java 插件的 plugin id,对于 Gradle 自带的核心插件都有惟一的 plugin id,这里的 java 对应的具体类型是 org.gradle.api.plugins.JavaPlugin,因此能够使用以下方式使用 Java 插件:闭包
apply.plugin:org.gradle.api.plugins.JavaPlugin
//org.gradle.api.plugins默认导入
apply.plugin:JavaPlugin
复制代码
二进制插件通常是打包在一个 Jar 中发布的,如自定义插件的时候在发布的时候要指定插件的 Plugin id,这个 plugin id 必须是惟一的,可以使用应用包名来保证 plugin id 的惟一性。app
脚本插件的使用实际上就是某个脚本文件的使用,使用脚本插件时将脚本加载进来就能够了,使用脚本插件要使用到关键字 from,后面的脚本文件能够是本地的也能够是网络上的脚本文件,下面定义一段脚本,咱们在 build.gradle 文件中使用它,具体以下:ide
//version.gradle文件
ext{
versionName = "1.0"
versionCode = 1
}
复制代码
下面将将在构建文件中使用这个脚本文件,具体以下:工具
//build.gradle文件
apply from: 'version.gradle'
task taskVersion{
doLast{
println "版本是${versionName},版本号是${versionCode}"
}
}
复制代码
上述代码的执行结果以下:
PS E:\Gradle\study\GradlePlugin> gradle taskVersion
> Task :taskVersion
版本是1.0,版本号是1
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
复制代码
显然,经过 apply from 引用到插件脚本了,脚本插件的使用可将构建使用的脚本文件分段整理,可将脚本文件分离成职责分明的单个脚本文件,而后直接使用 apply from 关键字来使用这些脚本文件,如可将某些工具性质的方法以及各个依赖使用的版本号分别定义到单个 gradle 文件中,方便统一调用和管理各个依赖的版本号等。
Project.apply() 能够接收三种不一样的参数,具体以下:
//闭包做为参数
void apply(Closure closure);
//配置一个ObjectConfigurationAction
void apply(Action<? super ObjectConfigurationAction> action);
//Map做为参数
void apply(Map<String, ?> options);
复制代码
使用上面三种方式能够配置一个插件,三种方式的写法以下:
//Map做为参数
apply plugin:'java'
//闭包做为一个参数
apply{
plugin 'java'
}
//配置一个ObjectConfigurationAction
apply(new Action<ObjectConfigurationAction>() {
@Override
void execute(ObjectConfigurationAction objectConfigurationAction) {
objectConfigurationAction.plugin('java')
}
})
复制代码
大多时候须要第三方的插件来构建项目,使用的时候必需要在 buildscript{} 里配置 classpath 才能使用,如 Android Gradle 插件使用的时候就须要在 buildgradle{} 里面配置对应的 classpath,代码参考以下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
复制代码
buildscript{} 块主要是在项目构建以前配置好项目构建的相关依赖,配置好这些依赖就能够经过以下方式使用插件了:
//使用时必须先在buildscript{}中配置相应的classpath
apply plugin: 'com.android.application'
复制代码
plugins DSL 是一种新的插件的应用方式,这种方式只能在 Gradle 2.1 以上才能够使用,使用方式参考以下:
//plugins DSL 方式
plugins{
id 'java'
}
//若是第三方插件托管到https://plugins.gradle.org/,就不用在
//buildscript中配置classpath了
plugins{
id "插件id" version '插件版本号'
}
复制代码
关于插件的使用就到此为止。
大多时候须要自定义插件来完成一些项目的构建操做,自定义插件必须实现 Plugin 接口,接口中的 apply 方法会在插件被应用的时候执行,可实现该方法在里面进行相关操做,下面使用 Android Studio 来进行一个简单插件的开发,插件的做用建立一个任务,这里主要借助 Android Studio 来建立一个 Groovy 工程,而后进行相关代码的开发。
在 Android Studio 中建立一个 Module , 删除出 src/main、build.gradle 之外的其余文件,而后建立一个 .groovy 文件实现 Plugin 接口,文件内容以下:
package com.manu.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
/** * 自定义插件 */
class MPlugin implements Plugin<Project>{
@Override
void apply(Project target) {
target.task('taskPlugin') {
doLast {
println "自定义插件建立任务"
}
}
}
}
复制代码
而后,指定该插件的 plugin id,在 src/main 下面建立 resources/META-INF/gradle-plugins 目录,而后建立一个带有 plugin id 的 properties 文件,文件内容以下:
//指定插件具体实现类
implementation-class=com.manu.plugin.MPlugin
复制代码
下面是 build.gradle 文件对应的配置参考以下:
apply plugin: 'groovy'
dependencies {
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
}
复制代码
能够说一个简单的插件就定义好了,为了方便实用将该插件项目生成 jar 包,而后就能够在其余项目中使用了,下面来一张自定义插件项目目录截图:
最后,在构建项目中使用该插件,复制插件到某个项目中,如复制到项目中的 libs 文件夹中,指定插件的 classpath ,使用 apply 方法使用插件便可:
apply plugin: 'com.manu.plugin'
buildscript{
dependencies{
classpath files('libs/plugin.jar')
}
}
复制代码
上述代码的执行结果以下:
PS E:\Gradle\study\GradlePlugin> gradle taskPlugin
> Task :taskPlugin
自定义插件建立任务
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
复制代码
由于插件建立了任务 taskPlugin,因此能够使用该任务,插件的基本使用如上所述,接下来将会继续学习 Java Gradle 插件的使用。能够关注公众号:jzman-blog,一块儿交流学习。