展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

任务执行顺序、开启关闭、超时、查找、任务规则、断言、默认任务

  • 任务执行顺序
1、dependsOn 强依赖方式
2、通过 Task 输入输出
3、通过 API 指定执行顺序
  • 动态执行任务
  • 在循环中注册同一类型的多个任务
# 注册4个同一类型的任务
4.times { counter ->
    tasks.register("task$counter") {
        doLast {
            println "I'm task number $counter" 
        }
    }
}
  • 在运行时动态地向任务添加依赖项
# 注册4个同一类型的任务,且使任务0依赖任务2和任务3,那么代表任务 2 和 3 需要在任务 0 之前优先加载
4.times { counter ->
    tasks.register("task$counter") {
        doLast {
            println "I'm task number $counter" 
        }
    }
}
tasks.named('task0') { dependsOn('task2', 'task3') }
  • 测试

  • 任务的开启与关闭

# 每个任务都有一个 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 atguigu {
    doLast {
        println "让天下没有难学的技术:尚硅谷"
    }
}

//根据任务名查找
tasks.findByName("atguigu").doFirst({println "尚硅谷校区1:北京...."})
tasks.getByName("atguigu").doFirst({println "尚硅谷校区2:深圳...."})
//根据任务路径查找【相对路径】
tasks.findByPath(":atguigu").doFirst({println "尚硅谷校区3:上海...."})
tasks.getByPath(":atguigu").doFirst({println "尚硅谷校区4:武汉...."})

# 执行 task: 
gradle atguigu

# 输出
尚硅谷校区4:武汉.... 
尚硅谷校区3:上海.... 
尚硅谷校区2:深圳.... 
尚硅谷校区1:北京.... 
让天下没有难学的技术:尚硅谷
  • 任务规则
# 当我们执行、依赖一个不存在的任务时,Gradle 会执行失败,报错误信息。那我们能否对其进行改进,当执行一个不存在的任务时,不是报错而是打印提示信息

task hello {
    doLast {
        println 'hello 尚硅谷的粉丝们' 
    }
}

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

# 测试: 
gradle abc hello 

# 此时当 abc 任务不存在时,也不会报异常【不中断执行】而是提示自定义的规则信息,继续执行 hello 任务。此外,它还可以根据不同的规则动态创建需要的任务等情况
  • 断言
# 断言就是一个条件表达式。Task 有一个 onlyIf 方法。它接受一个闭包作为参数,如果该闭包返回 true 则该任务执行,否则跳过。
这有很多用途,比如控制程序哪些情况下打什么包,什么时候执行单元测试,什么情况下执行单元测试的时候不执行网络测试等

task hello {
    doLast {
        println 'hello 尚硅谷的粉丝们' 
    }
}

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 Runnin
posted @ 2022-08-02 13:28  DogLeftover  阅读(139)  评论(0)    收藏  举报