前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8--Gradle进阶 - Gradle任务的入门、任务行为

8--Gradle进阶 - Gradle任务的入门、任务行为

作者头像
Devops海洋的渔夫
发布2023-09-01 08:55:03
1480
发布2023-09-01 08:55:03
举报
文章被收录于专栏:Devops专栏Devops专栏

8--Gradle进阶 - Gradle任务的入门、任务行为

Gradle Task

Gradle 项目工程的管理 实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译Java 源代码,拷贝文件, 打包Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置Project 的Property 以完成特定的操作。

下面我们来看看如何编写 Gradle Task 任务。

任务入门

可参考官方文档:https://docs.gradle.org/current/userguide/tutorial_using_tasks.html

我们在 build.gradle 文件编写 task 任务,如下:

1685894623286

代码语言:javascript
复制
// 自定义的任务1
task("task1") {
    println "hello task1...."
}

// 自定义的任务2
task "task2" {
    println "hello task2...."
}

// 自定义的任务3
task task3 {
    // 任务的配置阶段执行
    println "hello task3...."
    // 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
    doFirst() {
        println "task3 doFirst...."
    }
    doLast() {
        println "task3 doLast...."
    }
}

我们可以在终端输入 gradle 任务名称 来执行参数,同时可以增加参数 -i 打印 info 的参数,如下:

代码语言:javascript
复制
gradle -i task3

1685894792232

提示 1 :task3 的配置段是在配置阶段完成

提示 2 :task3 的doFirst、doLast 方法是执行阶段完成,并且doFirst 在doLast 执行之前执行。

**提示 3:**区分任务的配置段和任务的行为,任务的配置段在配置阶段执行,任务的行为在执行阶段执行

任务的行为

doFirst、doLast 两个方法可以在任务内部定义,也可以在任务外部定义:

代码语言:javascript
复制
// 自定义的任务3
task task3 {
    // 任务的配置阶段执行
    println "hello task3...."
    // 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
    doFirst() {
        println "task3 doFirst...."
    }
    doLast() {
        println "task3 doLast...."
    }
}

// 在task3外部定义doFirst doLast
task3.doFirst() {
    println "task3 doFirst.... outter"
}

task3.doLast() {
    println "task3 doLast.... outter"
}

执行 gradle task3 如下:

“可以看到外部定义的 doFirst 会比内部定义的 doFirst 较快执行,而外部定义的 doLast 会比内部定义的 doLast 较后执行。 ”

1685895007103

另外,task任务可以定义多个参数,我们再传入一个参数如下:

代码语言:javascript
复制
// 定义map
def map = new HashMap<String, Object>();
//action属性可以设置为闭包,设置task自身的行为
map.put("action", { println "taskD.." })

// 自定义的任务3
task(map, "task3") {
    // 任务的配置阶段执行
    println "hello task3...."
    // 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
    doFirst() {
        println "task3 doFirst...."
    }
    doLast() {
        println "task3 doLast...."
    }
}

// 在task3外部定义doFirst doLast
task3.doFirst() {
    println "task3 doFirst.... outter"
}

task3.doLast() {
    println "task3 doLast.... outter"
}

执行如下:

底层原理分析:无论是定义任务自身的 action,还是添加的doLast、doFirst 方法,其实底层都被放入到一个Action 的List 中了,最初这个 action List 是空的,当我们设置了 action【任务自身的行为】,它先将action 添加到列表中,此时列表中只有一个action,后续执行doFirst 的时候doFirst 在action 前面添加,执行 doLast 的时候doLast 在action 后面添加。doFirst 永远添加在actions List 的第一位,保证添加的Action 在现有的 action List 元素的最前面;doLast 永远都是在action List 末尾添加,保证其添加的Action 在现有的action List 元素的最后面。一个往前面添加,一个往后面添加,最后这个action List 就按顺序形成了doFirst、doSelf、doLast 三部分的 Actions,就达到 doFirst、doSelf、doLast 三部分的 Actions 顺序执行的目的。

提示 1:其中<<代表doLast,在gradle5.x 版本之后就废弃,不能使用了,如下所示:

代码语言:javascript
复制
task hello << {
    println 'Hello world!'
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 8--Gradle进阶 - Gradle任务的入门、任务行为
    • Gradle Task
      • 任务入门
      • 任务的行为
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档