Gradle之Gradle插件讲解(五)

笔记来源于以下文章:
http://liuwangshu.cn/application/gradle/5-plugins.html

前面我们学习了为什么要用Gradle、Gradle的入门基础和Groovy的基础,这些文章为Gradle的入门打下了基础,这一篇我们要来学习Gradle的插件。

1. Gradle插件概述

说到Gradle插件前,我们先要了解下什么是插件。我们先来看看下面这张图。

image

可以看到初始的机器人只有照相、地图、浏览器、计算机等功能,这显然是比较乏味的,我们可以给这个机器人安装很多其他的应用,使它提供更多的功能,如下图所示
image

我们给这个机器人安装了很多应用,这些应用不仅覆盖了人的衣食住行还提供了娱乐功能,我们可以玩游戏、听音乐和购物等等,机器人也得到了极大的提升,能够购为人类提供更多的服务。这些安装的应用可以理解为插件,这个插件可以自由的进行插拔,比如我们需要玩游戏时可以安装王者荣耀,如果不好玩就把它卸载掉。这么说来其实Android、iOS、Mac等操作系统采用的都是这种思想,而Gradle也是如此。

Gradle本身和初始的机器人一样,只是提供了基本的核心功能,其他的特性比如编译Java源码的能力,编译Android工程的能力等等就需要通过插件来实现了。本篇文章主要说的是Gradle插件,而不是Android Gradle插件。

2. 应用Gradle插件

想要应用插件,主要有两个步骤。一是解析插件,二是把插件应用到项目中,应用插件通过Project.apply()方法来完成。
在Gradle中一般有两种类型的插件,分别叫做脚本插件和对象插件。脚本插件是额外的构建脚本,它会进一步配置构建,可以把它理解为一个普通的build.gradle。对象插件又叫做二进制插件,是实现了Plugin接口的类,下面分别介绍如何使用它们。

2.1 插件脚本

在上一篇Gradle Wrapper的例子基础上,定义一个other.gradle,例子的目录结构是如下图所示:

ext{
    version='1.0'
    url="https://www.baidu.com"
}

这里先简单讲一下这个ext对象在这儿的作用,ext在这起到保存值得作用,在另一个gradle中apply后就可以直接引用这个ext存储的值。

ext对象还可以进行gradle的复用,比方说another.gradle内容如下:


task hello{
    doLast{
        println 'hello from other script'
    }
}

def showMyName(){
    'i am a boy'
}

ext{
    showName = showMyName()
}

再apply别的gradle中就可以节省别的gradle的代码,关于ext就暂时讲这么多,继续往下。

这个ext的属性就类似于我们的钱包一样,独立属于gradle与project对象。我们可以往这个ext对象里面放置属性。

这里的这实际上不算是一个真正的脚本插件,就是一个简单的脚本,主要是用于演示脚本插件是如何被应用的。我们在build.gradle中来应用这个插件:
build.gradle

apply from: 'other.gradle'
task test {
    doLast {
        println "版本为:${version},地址为:${url}"
    }
}

apply是Gradle project中提供的方法,用于配置项目中的插件。执行gradlew.bat test,会打印出想要的结果。

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle -q test
版本为:unspecified,地址为:https://www.baidu.com
PS D:\DevelopSoftWare_Location\Gradle\gradle_demo>
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相关的知识,脱离了本文的讨论范围,在这先简单介绍一下

  • buildscript{}这个是基础配置,所有的子模块都会读取到这个配置里面的内容,当构建开始的时候,就开始读取这个buildscript{}里面的内容。
  • repositories{}这个模块的内容告诉gradle去什么地址下载第三方的库。
  • jcenter()代表 https://bintray.com/bintray/jcenter
  • mavenCentral() 代表使用maven的服务器 https://search.maven.org/
2.3 插件DSL

Gradle的特性有四种状态,分别是Internal、Incubating、Public、Deprecated(弃用),插件DSL属于Incubating状态(孵化状态)。
这也导致插件DSL的特性在将来的Gradle版本中可能会发生变化,直到它不再孵化为止。
使用Java插件可以这么写:
build.gradle

plugin{
    
    id 'java'
}

很简洁,当然这是使用内部插件,如果外部插件被托管在https://plugins.gradle.org/,也可以这样写:

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也可以),我这里是用AS,改写build.gradle文件:

// Apply the plugin
apply plugin: GreetingPlugin


class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            doLast {
                println 'Hello from the GreetingPlugin'
            }
        }
    }
}

在build.gradle中自定义了一个插件GreetingPlugin,在apply方法中创建一个名称为hello的任务。在AS的Terminal中输入gradlew.bat hello来执行hello任务。

D:\DevelopSoftWare_Location\Android_Studio\DemoWorkSpace\DefinedGradle>gradlew hello

> Task :app:hello 
Hello from the GreetingPlugin


BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

这个例子只能在自己项目中使用,而且比较简单

3. 插件的作用和好处

Gradle插件可以做什么呢?主要有以下几点:

  1. 为项目配置依赖。
  2. 为项目配置约定,比如约定源代码的存放位置。
  3. 为项目添加任务,完成测试、编译、打包等任务。
  4. 为项目中的核心对象和其他插件的对象添加拓展类型。

使用Gradle插件主要有以下几点好处:

  1. 重用和减少维护在多个项目类似的逻辑的开销。
  2. 更高程度的模块化。
  3. 封装必要的逻辑,并允许构建脚本尽可能是声明性地。

最后

本篇的文章篇幅不长,主要是没有更多的介绍自定义对象插件。可能有的同学发现了,本系列的Gradle的文章都尽量不和Android和AS有所关联,为的是摆脱Android的束缚,Gradle本身就是一门技术,当我们了解了Gradle的核心思想后,再去学习Android Gradle时会有豁然开朗的效果

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Gradle 是一款构建系统工具,它的 DSL 基于 Groovy 实现。Gradle 构建的大部分功能都是通过插...
    任教主来也阅读 2,952评论 3 6
  • 参考资料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter阅读 10,876评论 0 6
  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,245评论 0 16
  • Android Studio作为Android应用开发的官方IDE,默认使用Gradle作为构建工具,所以对于An...
    feil0n9wan9阅读 1,580评论 1 6
  • 站在高山上的人 有的像狐狸一样狡猾 在世上到处麻痹人心 有的像豺狼一样凶狠 在人间遍地啃食人血 趴在地面上的人 有...
    欧阳小川阅读 1,148评论 103 92