需要准备

  • 一个熟悉的 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



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



AndroidStudio Gradle插件生成代码 gradle 插件开发_Gradle

接下来发布工程到本地仓库,方法跟上一章的自定义任务类一样,在 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