Gradle笔记 四 Gradle的核心 TASK(二)

简介: Gradle笔记 四 Gradle的核心 TASK

Gradle笔记 四 Gradle的核心 TASK(一)https://developer.aliyun.com/article/1391966


当然:我们也可以在定义任务的同时指定任务的属性,具体属性有:

在定义任务时也可以给任务分配属性:定义任务的时候可以直接指定任务属性,也可以给已有的任务动态分配属性:

//①.F是任务名,前面通过具名参数给map的属性赋值,以参数方式指定任务的属性信息
task(group: "onenewcode",description: "this is task B","F")
//②.H是任务名,定义任务的同时,在内部直接指定属性信息
task("H") {
group("onenewcode") description("this is the task H")
}
//③.Y是任务名,给已有的任务 在外部直接指定属性信息
task "y"{}
y.group="onenewcode"
clean.group("onenewcode") //案例:给已有的clean任务重新指定组信息
可以在 idea 中看到: 上面自定义的那几个任务和 gradle 自带的 

clean 任务已经跑到:onenewcode 组了。

任务类型

前面我们定义的task 都是DefaultTask 类型的,如果要完成某些具体的操作完全需要我们自己去编写gradle 脚本,势必有些麻烦,那有没有一些现成的任务类型可以使用呢?有的,Gradle 官网给出了一些现成的任务类型帮助我们快速完成想要的任务,我们只需要在创建任务的时候,指定当前任务的类型即可,然后即可使用这种类型中的属性和API 方法了。

常见任务类型 该类型任务的作用
Delete 删除文件或目录
Copy 将文件复制到目标目录中。此任务还可以在复制时重命名和筛选文件。
CreateStartScripts 创建启动脚本
Exec 执行命令行进程
GenerateMavenPom 生成 Maven 模块描述符(POM)文件。
GradleBuild 执行 Gradle 构建
Jar 组装 JAR 归档文件
JavaCompile 编译 Java 源文件
Javadoc 为 Java 类 生 成 HTML API 文 档
PublishToMavenRepository 将 MavenPublication 发布到 mavenartifactrepostal。
Tar 组装 TAR 存档文件
Test 执行 JUnit (3.8.x、4.x 或 5.x)或 TestNG 测试。
Upload 将 Configuration 的构件上传到一组存储库。
War 组装 WAR 档案。
Zip 组装 ZIP 归档文件。默认是压缩 ZIP 的内容。

拓展:自定义 Task 类型

def myTask=task MyDefinitionTask (type: CustomTask) myTask.doFirst(){
println "task 执行之前 执行的 doFirst方法"
}
myTask.doLast(){
println "task 执行之后 执行的 doLast方法"
}
class CustomTask extends DefaultTask {
//@TaskAction表示Task本身要执行的方法@TaskAction
def doSelf(){
println "Task 自身 在执行的in doSelf"
}
}

测试:gradle MyDefinitionTask

控制台输出:

任务的执行顺序

在 Gradle 中,有三种方式可以指定 Task 执行顺序:

1、dependsOn 强依赖方式

2、通过 Task 输入输出

3、通过 API 指定执行顺序

动态分配任务

gradle 的强大功能不仅仅用于定义任务的功能。例如,可以使用它在循环中注册同一类型的多个任务

times { counter -> tasks.register("task$counter") {
doLast {
println "I'm task number $counter"
}
}
}

一旦注册了任务,就可以通过 API 访问它们。例如,您可以使用它在运行时动态地向任务添加依赖项。Ant 不允许这样的事情发生。

times { counter -> tasks.register("task$counter") {
doLast {
println "I'm task number $counter"
}
}
}
tasks.named('task0') { dependsOn('task2', 'task3') }

构建 4 个任务,但是任务 0 必须依赖于任务 2 和 3,那么代表任务 2 和 3 需要在任务 0 之前优先加载。具体测试如下:

任务的关闭与开启

每个任务都有一个 enabled 默认为的标志 true。将其设置为 false 阻止执行任何任务动作。禁用的任务将标记为“跳过”。

task disableMe {
doLast {
println 'This task is Executing...'
}
enabled(true)//直接设置任务开启,默认值为true
}
//disableMe.enabled = false //设置关闭任务

任务的超时

每个任务都有一个 timeout 可用于限制其执行时间的属性。当任务达到超时时,其任务执行线程将被中断。该任务将被标记为失败。终结器任务仍将运行。如果 --continue 使用,其他任务可以在此之后继续运行。不响应中断的任务无法超时。Gradle 的所有内置任务均会及时响应超时

task a() {
doLast {
Thread.sleep(1000)
println "当前任务a执行了"
}
timeout = Duration.ofMillis(500)
}
task b() {
doLast {
println "当前任务b执行了"
}
}

在控制台使用: gradle a b 测试会发现执行a 的时候,由于a 执行超时,抛出异常,所以没有继续往下执行【b 也没执行】。然后在控制台使用: gradle a b –continue,测试会发现a 虽然执行失败,但是 b 还是执行了。

任务的查找

常用的任务查找方法有:

task onenewcode {
doLast {
println "让天下没有难学的技术:onenewcode"
}
}
//根据任务名查找
tasks.findByName("onenewcode").doFirst({println "onenewcode校区1:北京 "})
tasks.getByName("onenewcode").doFirst({println "onenewcode校区2:深圳  "})
//根据任务路径查找【相对路径】
tasks.findByPath(":onenewcode").doFirst({println "onenewcode校区3:上海    "}) tasks.getByPath(":onenewcode").doFirst({println "onenewcode校区4:武汉 "})

执行task: gradle onenewcode,输出结果如下所示:

onenewcode校区4:武汉....
onenewcode校区3:上海....
onenewcode校区2:深圳....
onenewcode校区1:北京....
让天下没有难学的技术:onenewcode

任务的规则

当我们执行、依赖一个不存在的任务时,Gradle 会执行失败,报错误信息。那我们能否对其进行改进,当执行一个不存在的任务时,不是报错而是打印提示信息呢?

task hello {
doLast {
println 'hello onenewcode的粉丝们'
}
}
tasks.addRule("对该规则的一个描述,便于调试、查看等"){ 
String taskName -> task(taskName) {
doLast {
println "该${taskName}任务不存在,请查证后再执行"
}
}
}

测试: 使用 gradle abc hello 进行测试,此时当 abc 任务不存在时,也不会报异常【不中断执行】而是提示自定义的规则信息,继续执行 hello 任务。此外,它还可以根据不同的规则动态创建需要的任务等情况。

任务的 onlyIf 断言

断言就是一个条件表达式。Task 有一个 onlyIf 方法。它接受一个闭包作为参数,如果该闭包返回 true 则该任务执行, 否则跳过。这有很多用途,比如控制程序哪些情况下打什么包,什么时候执行单元测试,什么情况下执行单元测试的时候不执行网络测试等。具体案例如下所示:

task hello {
doLast {
println 'hello onenewcode的粉丝们'
}
}
hello.onlyIf { !project.hasProperty('fensi') }

测试:通过-P 为Project 添加fensi 属性

gradle hello -Pfensi

默认任务

Gradle 允许您定义一个或多个在没有指定其他任务时执行的默认任务。代码如下所示:

defaultTasks 'myClean', 'myRun' tasks.register('myClean'){
doLast {
println 'Default Cleaning!'
}
}
tasks.register('myRun') { doLast {
println 'Default Running!'
}
}
tasks.register('other') { doLast {
println "I'm not a default task!"
}
}

测试及结果如下:

gradle -q Default Cleaning!

Default Running!

相关文章
|
5月前
|
Java 程序员 API
Gradle笔记 二 Gradle的基础Groovy
Gradle笔记 二 Gradle的基础Groovy
46 0
|
5月前
|
Java 关系型数据库 MySQL
Gradle笔记 六 Gradle 中的Dependencies
Gradle笔记 六 Gradle 中的Dependencies
50 0
|
5月前
|
前端开发 Java Maven
Gradle笔记 七 publishing 项目发布(二)
Gradle笔记 七 publishing 项目发布
94 0
|
5月前
|
Java Maven
Gradle笔记 七 publishing 项目发布(一)
Gradle笔记 七 publishing 项目发布
62 0
|
5月前
|
存储 缓存 Java
Gradle笔记 八 Gradle 插件(二)
Gradle笔记 八 Gradle 插件
64 0
|
5月前
|
Java
Gradle笔记 八 Gradle 插件(一)
Gradle笔记 八 Gradle 插件
77 0
|
5月前
|
Java
Gradle笔记 五 Gradle 中的文件操作
Gradle笔记 五 Gradle 中的文件操作
18 0
|
5月前
|
Java Maven
Gradle笔记 四 Gradle的核心 TASK(一)
Gradle笔记 四 Gradle的核心 TASK
46 0
|
5月前
|
Java Maven 数据安全/隐私保护
Gradle笔记 三 Gradle的项目周期和settings 文件
Gradle笔记 三 Gradle的项目周期和settings 文件
48 0
Gradle笔记 三 Gradle的项目周期和settings 文件
|
存储 Java 测试技术