Gradle之恋(5)-任务2

由于任务作为Gradle的核心功能模块,多花点精力是值得的,本文继上一篇主要涉及到:任务的执行顺序、为任务添加组和描述、跳过任务、扩展任务属性、定义默认任务。Gradle

任务顺序

如构建(build)不能在清理(clean)之前执行,因为这样无意义;构建之前必须先验证;做集成测试前先做单元测试等就必须指定其任务的执行顺序。

任务依赖的顺序

指定顺序不同于任务间的依赖顺序:依赖是指定哪些任务执行,而顺序是指定这些要执行的任务之间的顺序。

task hello{
doLast{
print 'hello'
}
}

task aline{
doLast{
print ' - '
}
}

task world(dependsOn:[hello,aline]){
doLast{
println 'world!'
}
}

当执行world任务时,执行的顺序是aline,hello,world,输出

- helloworld!

可见当任务有多个依赖时,会先执行被依赖的任务,而被依赖的任务执行顺序是依据任务名的字典顺序。你可以自定义顺序如

aline.mustRunAfter hello

则aline任务必须在hello之后执行,输出

hello - world!

指定顺序

指定顺序是通过两个关键词来设定的:mustRunAfter和shouldRunAfter,前者是严格指定的,而后者比较宽松,在两种情况下不按照指定的顺序执行:

  • 如果使用它产生循环顺序时,如指定了taskA在taskB之后,而又指定了taskB在taskA之后。
  • 这种情况官方文档貌似没说清楚?!!!后续再研究下源码看看。

    task taskX {
    doLast {
    println 'taskX'
    }
    }
    task taskY {
    doLast {
    println 'taskY'
    }
    }
    task taskZ {
    doLast {
    println 'taskZ'
    }
    }
    taskX.dependsOn taskY
    taskY.dependsOn taskZ
    taskZ.shouldRunAfter taskX

    执行

    $ gradle -q taskX
    taskZ
    taskY
    taskX

添加描述与组

可以通过关键词description和group为任务添加描述和组,然后可以使用gradle tasks来查看,如果该任务没有组,则需要额外参数–all来查看。

task description{
group 'mine'
description 'this is just a description.'
}

查看

Mine tasks
-———
description - this is just a description.

替换任务

有时根据需要,你可能想替换一个任务,这个很简单:使用关键字 overwrite 进行重写:

task overwriteTask{
doLast{
println 'this is a str task';
}
}

task overwriteTask(overwrite:true){
doLast{
println 'this is a new overwrite str task.'
}
}

执行

$ gradle -q oT
this is a new overwrite str task.

跳过任务

Gradle提供多种跳过任务的方法,不仅有命令行形式的,还有代码级别的。

命令行

当你想跳过依赖的任务时,可以使用-x形式跳过,如执行build跳过单元测试时:

$ gradle build -x test

断言

你可以使用onlyIf()来做单元,当其返回值为true时被执行,否则跳过.

task hello{
doLast{
println 'hello world!'
}
}

hello.onlyIf{!project.hasProperty('skipHello')}

当执行gradle hello -PskipHello 时,任务hello并不会执行。命令行参数-P为命令行设置property。

StopExecutionException

当任务抛出StopExecutionException将跳过任务继续执行下一个任务。

task hello{
doLast{
print 'hello '
}
}
hello.doFirst{
throw new StopExecutionException()
}

task world(dependsOn:hello){
doLast{
println 'world!'
}
}

执行任务world即可看到效果。

enabled属性

每个任务都有一个enabled属性,设置为false将跳过。

task hello{
doLast{
print 'hello '
}
}
hello.enabled = false

task world(dependsOn:hello){
doLast{
println 'world!'
}
}

扩展属性

你可以通过ext来扩展任务的属性

task hello{
ext.str="hello world!"
}

task say(){
doLast{
println hello.str
}
}

默认任务

Gradle允许你使用关键词defaultTasks定义一个或多个任务作为默认任务,当没有任务指定时则执行默认任务。

defaultTasks 'hello','intro'

task hello{
doLast{
println 'hello,welcome to you!'
}
}

task intro(){
doLast{
println 'my name is zhai'
}
}

可以执行gradle -q来验证。

翟前锋 wechat
欢迎订阅我的微信公众号:zhaiqianfeng!