gradle Task 详解

目录

Task定义和配置

Task的执行阶段

Task 的依赖

Task 指定执行顺序

Task 主gradle引入其他的gradle文件

将某一个task挂载到指定的task之后执行


gradle task官网:Task - Gradle DSL

Task定义和配置

查看工程下所有的task,使用如下命令

gradle tasks

定义一个task

task创建的源码

参数分别是 task 名称,和一个 closure。groovy语法的closure可以写在小括号外面,小括号可以省略

task的源码

public interface Task extends Comparable<Task>, ExtensionAware {
    String TASK_NAME = "name";
    String TASK_DESCRIPTION = "description";
    String TASK_GROUP = "group";
    String TASK_TYPE = "type";
	// 指定当前task的依赖的其他task
    String TASK_DEPENDS_ON = "dependsOn";
	// 重写 task
    String TASK_OVERWRITE = "overwrite";
	// 配置 task 任务逻辑
    String TASK_ACTION = "action";
	// 构造参数
    String TASK_CONSTRUCTOR_ARGS = "constructorArgs";
}

语法

task 自定义task名称

示例

task mytask {
    println "hello task."
}

执行自定义task

./gradle mytask


定义task也可以使用上面源码中的 TaskContainer 方式创建一个task

示例

this.tasks.create('mytask2') {
    println "hello task2."
}

给 task 添加分组

示例

// 给 自定义task 添加group 和 desc
// 示例一
task mytask1(group: "testGroup", description: "is am a test") {
    println "hello task1."
}
// 示例二
task mytask2 {
    setGroup("testGroup")
    setDescription("is am a test")
}

 添加分组的 task,在idea gradle项中会放在一个新组中,没有分组的自定义task会放在 other 中


Task的执行阶段

关于gradle的阶段请查看:gradle生命周期

配置阶段

普通定义的task都是在配置阶段都会被执行。

执行阶段

执行阶段就是特意使用了 gradle xxx 的方式指定某一个task执行。taks才会执行。其他命令task不会执行。

执行阶段的task,在配置阶段不会被执行。只有task才能在执行阶段被执行。使用如下两个函数,让 task 在gradle 执行阶段执行

  • doFirst:在task之前添加逻辑 // 在 @TaskAction 前面执行
  • 注解:@TaskAction,使用该注解的自定义task类中的代码也会在执行阶段执行
    • doLast:在task之后添加逻辑,(<< 表示 doLast,但是在gradle5.0版本中被移除) // // 在 @TaskAction 后面执行

示例

// 示例一
task testTask(group: "testGroup", description: "is am a test") {
    doFirst {
        println "hello doFirst. " + group
    }

}
// 示例二
testTask.doLast {
    println "hello doLast. " + description
}

// 示例三  << 表示 doLast,在gradle 5.0版本中 << 符号被移除 
task testTask2 << {
    println "hello doLast."
}

Task 的依赖

有3个task,taskA、taskB、taskC,taskA依赖taskB、taskC

//task taskA(dependsOn:"taskB"){    // 一个依赖的写法
// 被依赖的task定义在当前task后面,dependsOn参数要使用字符串""的方式
//task taskA(dependsOn:["taskB", "taskC"]){   // 多个依赖的写法
//    doLast {
//        println "taskA"
//    }
//}

task taskB {
    doLast {
        println "taskB"
    }
}

task taskC {
    doLast {
        println "taskC"
    }
}

// 被依赖的task在当前task之前,dependsOn参数可以直接使用变量的方式
task taskA(dependsOn:taskB){
    doLast {
        println "taskA"
    }
}

// 或者使用这种方式
//taskA.dependsOn([taskB, taskC])

为task添加指定前缀的task依赖

task libA {
    doLast{
        println "libA"
    }
}

task libB {
    doLast {
        println "libB"
    }
}

// 被依赖的要定义在前面,不然找不到
task taskTest {
    dependsOn this.tasks.findAll { task ->
        return task.name.startsWith("lib")
    }
    doLast {
        println "taskTest = " + dependsOn
    }
}

Task 指定执行顺序

有3个task,taskA、taskB、taskC,让task按照 A、B、C的顺序依次执行

task taskA {
    doLast {
        println "taskA"
    }
}

task taskB {
    mustRunAfter taskA    // 可以使用数组参数
    doLast {
        println "taskB"
    }
}

task taskC {
    mustRunAfter taskB
    doLast {
        println "taskC"
    }
}

执行命令:gradle taskB taskC taskA 


Task 主gradle引入其他的gradle文件

有一个 a.gradle 文件,如果需要让该文件生效。需要在主gradle文件中引用a.gradle

语法

apply from: 文件路径

示例

apply from: this.rootProject.file("a.gradle")

将某一个task挂载到指定的task之后执行

例如:在 task build 执行完成之后,接着自动执行 task a

this.afterEvaluate { org.gradle.api.Project project ->
    // 找到 build task
    def buildTask = project.tasks.getByName('build')
    if (buildTask == null) {
        throw GradleException("build task is not found.")
    }
    // 执行 build task 之后的 taskA
    buildTask.finalizedBy "taskA"
}


task taskA {
    doLast {
        println "taskA"
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/16992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】浅谈eloop机制

目录 1.eloop 机制 2.eloop结构体 2.1.eloop_data结构体 2.2 Socket事件结构体 2.3 Timeout事件结构体 2.4 Signal事件结构体 3.eloop_init 4.eloop_run 4.1 signal事件 4.2 socket事件 4.3 timeout事件 1.eloop 机制 主线程中启动事件监听机制&#xff0c;对不同的…

深度学习模型压缩与优化加速

1. 简介 深度学习&#xff08;Deep Learning&#xff09;因其计算复杂度或参数冗余&#xff0c;在一些场景和设备上限制了相应的模型部署&#xff0c;需要借助模型压缩、系统优化加速、异构计算等方法突破瓶颈&#xff0c;即分别在算法模型、计算图或算子优化以及硬件加速等层…

如何优雅地停掉线程?

很久很久以前&#xff0c;在一个名为“Springboot”的村庄中&#xff0c;住着一群热爱编程的程序员。他们喜欢探索新技术、优化自己的代码&#xff0c;为了打造更好的软件而不断努力着。 在这个村庄中&#xff0c;有一个名叫小明的程序员&#xff0c;他是村庄中最优秀的程序员…

一文打通java中内存泄露

目录 前置知识 内存泄漏&#xff08;memory leak&#xff09; 内存溢出&#xff08;out of memory&#xff09; Java中内存泄露的8种情况 静态集合类 单例模式 内部类持有外部类 各种连接&#xff0c;如数据库连接、网络连接和IO连接等 变量不合理的作用域 改变哈希值 …

第二十八章 React脚手架配置代理

为了更好地理解如何在React应用程序中配置代理&#xff0c;我们需要先了解什么是代理。 代理是一种充当客户端和服务器之间中间人的服务器。当客户端向服务器发送请求时&#xff0c;代理服务器将接收请求并将其转发到服务器。服务器将响应发送回代理服务器&#xff0c;代理服务…

机器视觉工程师职场四点“心态>交流=思路>知行合一”

视觉人机器视觉团队,他们热爱机器视觉行业,爱学习,爱分享。这一路上,首先感谢粉丝们805天一如既往的支持。我想团队拥有这些粉丝,是富有的,也是我们一直创作的动力。 是否记得毕业季,自己的豪言壮语。希望你毕业三年后,无论结果如何,不忘初心,继续前行。 机器视觉工程…

Flutter 中使用 Widgetbook 管理你的组件

Flutter 中使用 Widgetbook 管理你的组件 前言 Flutter 界面开发中我们有几个痛点 &#xff1a; 与设计师协作复用一套设计规范&#xff08;figma&#xff09; 可视化的管理你的组件代码&#xff08;基础组件、业务组件&#xff09; 不同设备尺寸测试你的组件 实时修改你的测试…

python并发编程:什么是并发编程?python对并发编程有哪些支持?

Python并发编程是指同时执行多个任务的编程模式。Python提供了多种实现并发编程的方式&#xff0c;包括多线程、多进程、协程、异步IO等。 为什么要引入并发编程 假设以下两个场景&#xff1a; 场景一: 一个网络爬虫&#xff0c;按顺序爬取花了一个小时&#xff0c;采用并发…

spring-模型数据和视图---视图解析器的说明以及大量代码演示

目录 spring-模型数据 ● 说明 应用实例需求 创建后面所有代码执行成功之后跳转的vote_ok.jsp页面 方式 1: 通过 HttpServletRequest放入 request 域 创建 Master类 创建Pet类 创建model_data.jsp 修改 VoteHandler增加方法 创建vote_ok.jsp, 显示数据 完成测试(Post…

[LeetCode周赛复盘] 第 103 场双周赛20230429

[LeetCode周赛复盘] 第 103 场双周赛20230429 一、本周周赛总结2656. K 个元素的最大和1. 题目描述2. 思路分析3. 代码实现 2657. 找到两个数组的前缀公共数组1. 题目描述2. 思路分析3. 代码实现 2658. 网格图中鱼的最大数目1. 题目描述2. 思路分析3. 代码实现 2659. 将数组清…

Docker consul

目录 一、Docker consul的容器服务和发现 ①服务注册与发现的含义 ②什么是consul 二、服务部署 ①部署consul服务 &#xff08;1&#xff09;查看集群信息 &#xff08;2&#xff09;通过http api获取集群信息 ②部署registrator服务器 &#xff08;1&#xff09;安装…

计算机视觉毕业后找不到工作怎么办?怒刷leetcode,还是另寻他路?

文章目录 一、计算机视觉毕业后找不到工作怎么办&#xff1f;二、大环境&#xff1a;前两年的泡沫太大三、还是要把自己的基本功搞扎实&#xff0c;真正的人才什么时候都紧缺四、转换思路&#xff0c;另投他坑五、要有毅力&#xff0c;心态放平六、最后的建议 一、计算机视觉毕…

应急加固初试(windows sever 2008)

前言 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博主、华为网络安全云享专家、腾讯云自媒体分享计划博主 …

【服务器】威联通NAS文件共享 - 搭建SFTP服务并内网穿透实现在外远程访问

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1. 威联通NAS启用SFTP 2. 测试局域网访问 3. 内网穿透 3.1 威联通安装cpolar内网穿透 3.2 创建隧道 3.3 测试公网远程访问 4. 配置固定公网TCP端口地址 4.1 保留一个固定TCP…

chatGPT+Midjourney制作绘画本

chatGPTMidjourney制作绘画本 灵感来源&#xff1a;https://www.bilibili.com/video/BV1N24y1F7ga/?spm_id_from888.80997.embed_other.whitelist&vd_source6dd97671c42eb7cf111063714216bd0b 最终效果&#xff1a; 绘本故事 故事塑造能力弱的人可以使用chatGPT来帮助编…

JAVAWeb11-服务器渲染技术 -JSP-01-JSP基础

1. 现状 1、JSP 使用情况 2、Thymeleaf 使用情况, 通常和 SpringBoot 结合(也会讲) 3、Vue 使用情况 2. 学 JSP 前&#xff0c;老师要说的几句话 目前主流的技术是 前后端分离 (比如: Spring Boot Vue/React), 我们会讲的.[看一下]JSP 技术使用在逐渐减少&#xff…

C. Maximum Subrectangle(思维 + 考察两个数组相乘得到的矩阵的含义)

Problem - C - Codeforces 给定两个正整数数组 a 和 b&#xff0c;长度分别为 n 和 m。 定义矩阵 c 为一个 nm 的矩阵&#xff0c;其中 ci,jai⋅bj。 你需要在矩阵 c 中找到一个子矩形&#xff0c;使得它的元素之和最多为 x&#xff0c;并且它的面积&#xff08;即元素总数&a…

【Redis】Redis分布式锁的10个坑

文章目录 前言1. 非原子操作&#xff08;setnx expire&#xff09;2.被别的客户端请求覆盖&#xff08; setnx value为过期时间&#xff09;3. 忘记设置过期时间4. 业务处理完&#xff0c;忘记释放锁5. B的锁被A给释放了6. 释放锁时&#xff0c;不是原子性7. 锁过期释放&…

【Linux内核解析-linux-5.14.10-内核源码注释】MM内存管理内核启动初始化源码解析

源码 这是Linux内核中的mm_init函数的代码&#xff0c;其作用是初始化内存管理相关的组件和数据结构。 static: 这是一个函数声明修饰符&#xff0c;表示该函数只在当前文件中可见。 void __init: 这是函数的返回类型和修饰符&#xff0c;表示该函数是内核初始化代码。 page…

Redis缓存(双写一致性问题)

Redis缓存&#xff08;双写一致性问题&#xff09; 1 什么是缓存?1.1 为什么要使用缓存1.2 如何使用缓存 2 添加缓存2.1 、缓存模型和思路2.2、代码如下 3 缓存更新策略3.1 、数据库缓存不一致解决方案&#xff1a;3.2 、数据库和缓存不一致采用什么方案 4 实现商铺和缓存与数…