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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

PHP Cookbook

PHP Cookbook

Adam Trachtenberg、David Sklar / O'Reilly Media / 2006-08-01 / USD 44.99

When it comes to creating dynamic web sites, the open source PHP language is red-hot property: used on more than 20 million web sites today, PHP is now more popular than Microsoft's ASP.NET technology......一起来看看 《PHP Cookbook》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具