美文网首页
Gradle第8课:Gradle 中自定义插件的实现

Gradle第8课:Gradle 中自定义插件的实现

作者: 米饭超人 | 来源:发表于2018-08-28 11:08 被阅读37次

需要准备

  • 一个熟悉的 IDE 开发工具
  • JDK 7及以上
  • Gradle 3.2以上

Gradle 插件的介绍

Gradle 插件功能可以很好的组织我们的编译逻辑代码,使它能在不同的项目和工程中重复使用。我们可以自定义实现自己的 Gradle 插件,然后分享给其他人使用。我们可以使用不同的语言来实现,不过本章中作者选择使用 Groovy 来实现的,大家也可以使用像 java、scala 等喜欢的别的语言来实现。Gradle 自定义插件的实现和自定义任务类型非常的相似,而它两一般都是结合使用的。所以如果还不了解如何自定义任务类的可以先看上一节的内容。

实现自定义的插件

首先有三种方式来编写我们的插件

  1. 在我们构建项目的 build.gradle 脚本中直接编写,这种方式的好处是插件会自动被编译加载到我们的 classpath 中,我们不需要额外做任何的事情,但是它有很明显的局限性,就是除了在包括它的脚本外别的地方无法复用。

  2. 在我们构建项目的rootProjectDir/buildSrc/src/main/groovy 目录下编写,Gradle 会自动编译到当前项目的classpath中,该项目下所有编译脚本都可以使用该插件,但是除了当前项目之外的都无法复用。

  3. 以单独的工程方式编写,这个工程最终编译发布为一个 JAR 包,它可以在多个项目或不同的团队中共享使用。

我们首先使用第一种方式来实现一个简单插件( plugin )的例子。通过实现Plugin接口来实现自定义插件类,然后在需要使用的工程中调用Plugin.apply(T)方法来初始化和调用插件实例,同时工程( project )对象会作为一个参数传递给该插件,这样我们就可以在该自定义的插件中通过该工程对象来对工程进行相应的配置管理了。

接下来我们开始编写一个简单的 HelloPlugin 插件,其中只是简单的向工程中添加一个 hello 任务,代码如下:

apply plugin: HelloPlugin

class HelloPlugin implements Plugin<Project> {
    // 此方法接受一个Project对象
    void apply(Project project) {
        // 向project对象添加hello任务
        project.task('hello') {
            doLast {
                println "Hello from the HelloPlugin"
            }
        }
    }
}

然后执行命令gradle -q hello,其结果如下:

> gradle -q hello
Hello from the HelloPlugin

为自定义插件传递参数

像我们使用的大多数其他插件一样,我们可以接收一些自定义的参数,然后在 Gradle 脚本文件中配置使用这些参数。我们可以使用 extension objects来现实给插件传参,而每个 Gradle 工程都有一个ExtensionContainer对象,它可以保存我们为插件设置的属性值,具体实现看下面代码的注释:

apply plugin: HelloPlugin

// 使用闭包方式设置值
greeting {
    message = 'Hi'
    greeter = 'Gradle'
}

class HelloPlugin implements Plugin<Project> {
    // 此方法接受一个Project对象
    void apply(Project project) {
        // 向extension container保存greeting参数
        // 该greeting参数为HelloPluginExtension的实体bean
        project.extensions.create("greeting", HelloPluginExtension)
        // 向project对象添加hello任务
        project.task('hello') {
            doLast {
                println "${project.greeting.message} from ${project.greeting.greeter}"
            }
        }
    }
}

// 定义一个实体bean对象
class HelloPluginExtension {
    String message
    String greeter
}

然后执行命令gradle -q hello,其结果如下:

> gradle -q hello
Hi from Gradle

在一个独立的工程中实现自定义插件和任务

还是继续使用上一章中自定义任务的工程,使用IDEA打开该工程,新添加src/main/groovy/org/gradle/HelloPlugin.groovy文件,其代码如下:

class HelloPlugin implements Plugin<Project> {
    // 此方法接受一个Project对象
    void apply(Project project) {
        // 向extension container保存greeting参数
        // 该greeting参数为HelloPluginExtension的实体bean
        project.extensions.create("greeting", HelloPluginExtension)
        // 向project对象添加hello任务
        project.task('hello',type:GreetingTask) {
            // 设置greeting参数
            greeting = 'another project working!'

            doLast {
                println "${project.greeting.message} from ${project.greeting.greeter}"
            }
        }
    }
}

再添加src/main/groovy/org/gradle/HelloPluginExtension.groovy文件,其代码如下:

class HelloPluginExtension {
    String message
    String greeter
}

上面代码实现了自定义的插件类,但是 Gradle 又是如何找到我们的自定义插件呢?这就需要我们在工程的 resources 目录下建立 META-INF/gradle-plugins 文件夹,在其中新建 helloPlugin.properties 文件,其代码如下:

implementation-class=org.gradle.HelloPlugin

最终工程的结构如下,红框中为咱们新添加的文件:

enter image description here

接下来发布工程到本地仓库,方法跟上一章的自定义任务类一样,在 IDEA 中直接运行 publish 任务。

最后在另外一个工程中使用该插件。使用 IDEA 开发工具新创建一个 Gradle 工程,在该工程中将使用我们上面自定义的插件,首先我们需要使用 buildscript { } 块来使类添加到编译脚本的 classpath 中,下面 build.gradle 中的代码展示了如何加载本地仓库的插件:

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'org.gradle', name: 'customPlugin',
                version: '1.0-SNAPSHOT'
    }
}

// 应用自定义插件
apply plugin: 'helloPlugin'

// 为插件传递参数
greeting {
    message = 'Hello'
    greeter = 'gradle world'
}

执行命令 gradle -q hello 的结果如下,代表我们自定义的插件已经被成功加载了:

> gradle -q hello
another project working!
Hello from gradle world

小结

本章通过实现了一个自定义插件,并且结合自定义任务类一起使用。

相关文章

  • Gradle自定义插件

    Gradle自定义插件 在Gradle中创建自定义插件,Gradle提供了三种方式: 在build.gradle脚...

  • 自定义Gradle插件

    个人博客http://www.milovetingting.cn 自定义Gradle插件 自定义Gradle插件可...

  • 启用Gradle远程调试

    在Gradle学习10——自定义Gradle插件 这篇文章中介绍了编写插件的几种方式。编写gradle对象插件的实...

  • gradle插件调试

    在Gradle学习10——自定义Gradle插件 这篇文章中介绍了编写插件的几种方式。编写gradle对象插件的实...

  • Gradle 插件

    比如一个自动输出Lint报告的Gradle插件1.自定义Gradle插件的方式Gradle是采用Groovy语言,...

  • 自定义Gradle-Plugin 插件详解

    自定义Gradle-Plugin 插件 官方文档给出了详细的实现步骤,笔者 将参考官方文档:通过自定义插件实现li...

  • 使用Gradle编译Java工程之自定义Plugins篇

    文章目的 本章中我们将了解到如何自定义实现Gradle的插件(plugin)功能,并且亲自参与实现一个简单插件的全...

  • Android Gradle权威指南 笔记

    第7章 Android Gradle插件 7.1 Android Gradle插件简介 7.2 Android ...

  • Gradle 自定义插件

    Gradle 自定义插件 官方原文 gradle学习官方翻译网站 1.新建项目 配置build.gradle 创建...

  • 自定义gradle插件

    前言 在Android studio中,使用gradle进行编译、打包,在一些情况下,学会自定义gradle插件,...

网友评论

      本文标题:Gradle第8课:Gradle 中自定义插件的实现

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