Gradle插件开发(2) - extensions和Task

栏目: 编程工具 · 发布时间: 5年前

内容简介:Gradle是支持配置,外部的配置文件来设置插件的一些输入条件,在插件中是通过如我们在项目的这代表一条这条消息,

Gradle是支持配置,外部的配置文件来设置插件的一些输入条件,在插件中是通过 extensions 实现的。

配置

如我们在项目的 build.gradle 下配置如下:

cyMessage {
    message = 'hello '
    greeter = 'cyning'
}

这代表一条这条消息, message 代表消息内容, greeter 代表消息源。

那么插件如何获取这条消息呢?

我们需要在 Plugin 来注册一个实体类来获取。

void apply(Project project) {
        def extension = project.extensions.create("cyMessage", Message)
    }

实体

其中Message是个实体类:

代码片段 1

public class Message {
    String message = "empty"
    String greeter = "none"
}

使用

我们可以自己写一个 task (下一节就是会介绍task)来验证 extensions 获取是否成功。

代码片段 2

def extension = project.extensions.create("cyMessage", Message)

project.task('sendMessage') {
    doLast {
        println "${extension.message} from ${extension.greeter}"
        println project.cyMessage.message + "from ${extension.greeter}"

    }
}

可以注意到

1. extensions.create("cyMessage", Message) 返回的是 Message 的实例

2.通过 extensions.createproject注册了一个 cyMessage`的属性。

所以获取代码片段中的 message 也有两种方式”

${extension.message}project.cyMessage.message

Task

Task是我们插件的任务单位,也就是说插件实际上就是一个个task,还记得我们常用的clean命令,实际上clean也是task,在android项目中,我们可以用 gradlew tasks 来查看这个项目中的task。

Gradle插件开发(2) - extensions和Task

每个task实际上是可以分组的,如上图的 Android tasks Build tasks ,每个任务后面的小字实际上是task的描述,

task的创建

task目前可以有多种方法创建和操作。

gradle脚本

task hello1 << {
    println 'hello1'
}

task hello2 {
    doLast {
        println 'hello2'}
}

task hello3 {
    println "task ----"
}

// 类似于<< 不过新版本已经弃用
hello3.leftShift {
    print("hello world 3")
}
  1. doLast 相当于是在任务执行 Task 结束前要执行的,是这个 Task 的最后一个步骤。
  2. <<leftShift 是同一个意思也表示在相当于是在任务执行Task结束前要执行的,

groovy脚本创建

gradle 脚本能容易写出脚本,但是对于一些复杂的 Task 还是需要我们用 groovy 来实现,可以控制控制他的灵活度。

我们可以来写我们的第一个 Task .

public class FirstTask extends DefaultTask {

    String message = 'This is default message'

    // @TaskAction 表示该Task要执行的动作,即在调用该Task时,hello()方法将被执行
    @TaskAction
    def hello(){
        println "Hello world. $message"
    }

}

@TaskAction 有注释,我就不再重复了, $message 是我们内部定义的一个变量,默认是 message

我们用这个 task 时只需要,写入我们的type为 FirstTask .

// hello使用了默认的message值
task task1(type:FirstTask)

// 重新设置了message的值
task task2(type:FirstTask){
    message ="I am an android developer"
}

使用

可以直接在终端下输入

./gradlew :app:task2

app就是引入我们的task的项目,当然你可以可以用 android studio 的GUI界面.

taskextensions 自定义插件

那我们开始我们的能传参的插件:

在主项目的build.gradle开始我们的配置:

apply plugin: 'cyning'
cyMessage {
    message = 'hello '
    greeter = 'cyning'
}

cyning 就是我们的插件, cyMessage 是我们定义的 ext· .

插件

我们需要定义自己的 plugin

public class FirstPlugin implements Plugin<Project> {

    void apply(Project project) {

        def cyMessage = project.extensions.create("cyMessage", Message, project)


        Task sendMsgTsk = project.task("sendMessage", type:FirstTask ) {

            message = cyMessage.message
            greeter = cyMessage.greeter

        }

    }
}

接收从外部的参数 cyMessage ,同时将 cyMessage.messagecyMessage.greeter 传给 sendMessage 这个task.

Message这个实体类想获取 extensions ,必须按照如下方法实现:

public class Message {
    final Property<String> message;

    final Property<String> greeter;


    Message(Project project) {
        message = project.objects.property(String)
        greeter = project.objects.property(String)

        message.set('Hello default message' )
    }
}

注意这个 project 是在 plugin 时传入的.

task也很好定义

public class FirstTask extends DefaultTask {
    final Property<String> message = project.objects.property(String)
    final Property<String> greeter = project.objects.property(String)

    // @TaskAction 表示该Task要执行的动作,即在调用该Task时,hello()方法将被执行
    @TaskAction
    def hello(){
        println   message.get() + " from " + greeter.get()
    }

}

参考

  1. 创建Task的多种方法

  2. Writing Custom Plugins


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

梦断代码

梦断代码

Scott Rosenberg / 韩磊 / 电子工业出版社 / 2008.06 / 49.00元

软件乃是人类自以为最有把握,实则最难掌控的技术。本书作者罗森伯格对OSAF主持的Chandler项目进行田野调查,跟踪经年,试图借由Chandler的开发过程揭示软件开发中的一些根本性大问题。. 本书是讲一事,也是讲百千事;是写一软件,也是写百千软件;是写一群人,也是写百千万人。任何一个在软件领域稍有经验的技术人员看完本书,必掩卷长叹:做软件难。...一起来看看 《梦断代码》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具