原文来自微信公众号:刘望舒
说到Gradle插件前,咱们先要了解下什么是插件。在Android进阶三部曲第二部《Android进阶解密》一书中,我为了讲解插件化的原理,讲解了什么是插件,咱们先来看看下面这张图。java
能够看到初始的机器人只有照相、地图、浏览器、计算机等功能,这显然是比较乏味的,咱们能够给这个机器人安装不少其余的应用,使它提供更多的功能,以下图所示android
咱们给这个机器人安装了不少应用,这些应用不只覆盖了人的衣食住行还提供了娱乐功能,咱们能够玩游戏、听音乐和购物等等,机器人也获得了极大的提高,可以购为人类提供更多的服务。这些安装的应用能够理解为插件,这个插件能够自由的进行插拔,好比咱们须要玩游戏时能够安装王者荣耀,若是很差玩就把它卸载掉。这么说来其实Android、iOS、Mac等操做系统采用的都是这种思想,而Gradle也是如此。
Gradle自己和初始的机器人同样,只是提供了基本的核心功能,其余的特性好比编译Java源码的能力,编译Android工程的能力等等就须要经过插件来实现了。本篇文章主要说的是Gradle插件,而不是Android Gradle插件。c++
要想应用插件,主要有两个步骤,一是解析插件,二是把插件应用到项目中,应用插件经过 Project.apply() 方法来完成。
在Gradle中通常有两种类型的插件,分别叫作脚本插件和对象插件。脚本插件是额外的构建脚本,它会进一步配置构建,能够把它理解为一个普通的build.gradle。对象插件又叫作二进制插件,是实现了Plugin接口的类,下面分别介绍如何使用它们。api
2.1 脚本插件浏览器
在上一篇文章看似无用,实则重要的Gradle Wrapperr的例子基础上,定义一个other.gradle,例子的目录结构是以下图所示。微信
other.gradleapp
ext{ verson='1.0' url='http://liuwangshu.cn' }
这实际上不算是一个真正的脚本插件,就是一个简单的脚本,主要是用于演示脚本插件是如何被应用的。咱们在build.gradle中来应用这个插件:
build.gradlemaven
apply from: 'other.gradle' task test { doLast { println "版本为:${verson},地址为:${url}" } }
apply是Gradle project中提供的方法,用于配置项目中的插件。执行gradlew.bat test,会打印出想要的结果。ide
2.2 对象插件模块化
咱们知道对象插件就是实现了org.gradle.api.plugins<Project>接口的插件,对象插件能够分为内部插件和第三方插件。
2.2.1 内部插件
若是咱们想要应用Java插件能够这么写:
build.gradle
apply plugin: org.gradle.api.plugins.JavaPlugin
Gradle默认就导入了org.gradle.api.plugins包,所以咱们也能够去掉包名:
apply plugin: JavaPlugin
实现了org.gradle.api.plugins接口的插件会有pulginid,使用pulginid是最简洁、最经常使用的方式:
apply plugin: 'java'
Gradle 的发行包中有大量的插件,这些插件有不少类型,好比语言插件、集成插件、软件开发插件等等,若是咱们想
向项目添加 c++ 源代码编译功能,能够这么写:
apply plugin: 'cpp'
2.2.2 第三方插件
第三方的对象插件一般是jar文件,要想让构建脚本知道第三方插件的存在,须要使用buildscrip来设置。
buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4" } } apply plugin: "com.jfrog.bintray"
在buildscrip中来定义插件所在的原始仓库和插件的依赖 ,再经过apply方法配置就能够了。Android Gradle插件也属于第三方插件,若是咱们想引入Android Gradle插件,能够这么写:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.2' } } apply plugin: 'com.android.application'
这样咱们就可使用Android Gradle插件,经过apply方法来使用App工程插件,这样项目会编译成为一个apk,这里涉及了Android相关的知识,脱离了本文的讨论范围,具体的请见后续的Gradle for Android系列。
2.3 插件DSL
Gradle的特性有四种状态,分别是Internal、Incubating、Public、Deprecated,插件DSL属于Incubating状态(孵化状态)。
这也致使插件DSL的特性在未来的Gradle版本中可能会发生变化,直到它再也不孵化为止。
使用Java插件能够这么写:
build.gradle
plugins { id 'java' }
很简洁,固然这是使用内部插件,若是外部插件被托管在https://plugins.gradle.org/,也能够这样写:
build.gradle
plugins { id "com.jfrog.bintray" version "1.8.4" }
不须要再配置buildscript了,直接配置plugins来使用插件。
2.4 自定义对象插件
对象插件是实现了org.gradle.api.plugins<Project>接口的插件,这个接口中只定义个一个简单的apply方法,想要自定义插件就须要去实现org.gradle.api.plugins<Project>接口。
来实现一个简单的自定义插件,为了方便测试,再也不采用文本编辑,而是使用IntelliJ来编辑(AS也能够),用IntelliJ来打开2.1小节的例子,改写build.gradle文件:
build.gradle
apply plugin:CustomPlugin class CustomPlugin implements Plugin<Project> { @Override void apply(Project project) { project.task('CustomPluginTask') { doLast { println "自定义插件" } } } }
在build.gradle中自定义了一个插件CustomPlugin,在apply方法中建立一个名称为CustomPluginTask的任务。在IntelliJ的Terminal中输入gradlew.bat CustomPluginTask来执行CustomPluginTask任务。
这个例子只能在本身项目中使用,并且比较简单,更复杂的因为篇幅缘由会在下一篇文章进行介绍。
Gradle插件能够作什么呢?主要有如下的几点
使用Gradle插件主要有如下的好处: