美文网首页Android开发Android开发Android技术知识
Gradle核心思想(五)通俗易懂的Gradle插件讲解

Gradle核心思想(五)通俗易懂的Gradle插件讲解

作者: 刘望舒 | 来源:发表于2019-04-05 01:46 被阅读6次

    本文首发于 公众号 刘望舒
    关联文章
    Gradle核心思想(一)为什么现在要用Gradle?
    Gradle核心思想(二)Gradle入门前奏
    Gradle核心思想(三)Groovy快速入门指南
    Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper
    Gradle核心思想(五)通俗易懂的Gradle插件讲解

    前言

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

    1.Gradle插件概述

    说到Gradle插件前,我们先要了解下什么是插件。在Android进阶三部曲第二部《Android进阶解密》一书中,我为了讲解插件化的原理,讲解了什么是插件,我们先来看看下面这张图。



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

    我们给这个机器人安装了很多应用,这些应用不仅覆盖了人的衣食住行还提供了娱乐功能,我们可以玩游戏、听音乐和购物等等,机器人也得到了极大的提升,能够购为人类提供更多的服务。这些安装的应用可以理解为插件,这个插件可以自由的进行插拔,比如我们需要玩游戏时可以安装王者荣耀,如果不好玩就把它卸载掉。这么说来其实Android、iOS、Mac等操作系统采用的都是这种思想,而Gradle也是如此。
    Gradle本身和初始的机器人一样,只是提供了基本的核心功能,其他的特性比如编译Java源码的能力,编译Android工程的能力等等就需要通过插件来实现了。本篇文章主要说的是Gradle插件,而不是Android Gradle插件。

    2.应用Gradle插件

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

    2.1 脚本插件

    在上一篇文章Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper的例子基础上,定义一个other.gradle,例子的目录结构是如下图所示。

    other.gradle

    ext{
    verson='1.0'
    url='http://liuwangshu.cn'
    }
    

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

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

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

    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任务。


    这个例子只能在自己项目中使用,而且比较简单,更复杂的由于篇幅原因会在本系列的下一篇文章进行介绍。

    3.Gradle插件的作用和好处

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

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

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

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

    总结

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


    分享大前端、Java、跨平台等技术,关注职业发展和行业动态。


    相关文章

      网友评论

        本文标题:Gradle核心思想(五)通俗易懂的Gradle插件讲解

        本文链接:https://www.haomeiwen.com/subject/vmaciqtx.html