Gradle系列之认识Gradle任务 (3)

由于 Task 的执行是在遍历需要执行的 action 列表,为了保证执行的顺序,则必须将 doFirst 对应的 action 放在 action 列表的最前面,doLast 对应的 action 放在 action 列表的最后面,doSelf 对应的 action 放置在列表的中间位置,这样就能保证对应的执行顺序了,下面是伪代码:

//创建任务的时候将使用@TaskAction标注的方法作为Task本身执行的Task //此时,任务正在创建,actionList里面只有Task本身执行的Action actionList.add(0,doSelfAction) //任务创建完成之后,如果设置了doFirst则会在actionList最前面添加doFist对应的action //此时,doFirst对应的action添加actionList的最前面,保证了doFirst方法在任务开始执行之前执行 actionList.add(0,doFirstAction) //任务创建完成之后,如果设置了doLast则会在actionList最后面添加doLast对应的action,保证了doLast方法在任务开始执行之后执行 actionList.add(doLastAction)

任务执行的流程基本如上,尽量在具体实践中多体会。

任务排序

Gradle 中任务排序使用到的是 Task 的两个方法 shoundRunAfter 和 mustRunAfter,可以方便的控制两个任务谁先执行:

/** * 任务顺序 * taskC.shouldRunAfter(taskD):表示taskC要在taskD的后面执行 * taskC.mustRunAfter(taskD):表示taskC必须要在taskD的后面执行 */ task taskC { doFirst{ println "taskC" } } task taskD { doFirst{ println "taskD" } } taskC.shouldRunAfter(taskD)

上述代码的执行结果,参考如下:

PS E:\Gradle\study\GradleTask2> gradle taskC taskD > Task :taskD taskD > Task :taskC taskC BUILD SUCCESSFUL in 2s 2 actionable tasks: 2 executed 任务的启用和禁用

Task 中有个 enabled 属性,可以使用该属性启用和禁用某个任务,设置为 true 则启用该任务,反之则禁用该任务,该属性默认为 true,使用如下所示:

taskA.enabled = true 任务的onlyIf断言

断言是一个条件表达式, Task 对象有一个 onlyIf 方法,该方法可以接收一个闭包作为参数,如果该闭包内参数返回 true,则该任务执行,反之则不执行该任务,这样可以通过任务的断言来控制那些任务需要执行,下面通过一个打包的案列来学习任务的断言,代码参考如下:

//任务的onlyIf断言 final String BUILD_ALL = 'all' final String BUILD_FIRST = 'first' final String BUILD_OTHERS = 'others' task taskTencentRelease{ doLast{ println "打应用宝渠道包" } } task taskBaiduRelease{ doLast{ println "打百度手机助手渠道包" } } task taskMiuiRelease{ doLast{ println "打小米应用商店渠道包" } } task buildTask{ group BasePlugin.BUILD_GROUP description "打渠道包" } //为buildTask添加依赖的具体任务 buildTask.dependsOn taskTencentRelease, taskBaiduRelease, taskMiuiRelease taskTencentRelease.onlyIf{ if (project.hasProperty("buildApp")){ Object buildApp = project.property("buildApp") return BUILD_ALL == buildApp || BUILD_FIRST == buildApp }else{ return true } } taskBaiduRelease.onlyIf{ if (project.hasProperty("buildApp")){ Object buildApp = project.property("buildApp") return BUILD_ALL == buildApp || BUILD_FIRST == buildApp }else{ return true } } taskMiuiRelease.onlyIf{ if (project.hasProperty("buildApp")){ Object buildApp = project.property("buildApp") return BUILD_OTHERS == buildApp || BUILD_ALL == buildApp }else{ return true } }

下面是上述代码的执行结果:

PS E:\Gradle\study\GradleTask2> gradle -PbuildApp=first buildTask > Task :taskBaiduRelease 打百度手机助手渠道包 > Task :taskTencentRelease 打应用宝渠道包 BUILD SUCCESSFUL in 1s 2 actionable tasks: 2 executed PS E:\Gradle\study\GradleTask2> gradle -PbuildApp=others buildTask > Task :taskMiuiRelease 打小米应用商店渠道包 BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed PS E:\Gradle\study\GradleTask2> gradle -PbuildApp=all buildTask > Task :taskBaiduRelease 打百度手机助手渠道包 > Task :taskMiuiRelease 打小米应用商店渠道包 > Task :taskTencentRelease 打应用宝渠道包 BUILD SUCCESSFUL in 1s 3 actionable tasks: 3 executed

可以看出,当我们执行 buildTask 时为 Project 配置了属性 buildApp,通过 buildApp 不同的值,借助 onlyIf 实现了不同渠道包的定制打包策略,可在实际开发中借鉴加以使用。

此外,注意上述代码执行命令的写法,具体如下:

//其中buildApp和=后面的值others是键值对的关系,使用命令执行任务时可使用-P命令简写 //-P要为当前Project指定K-V的属性键值对,即-PK=V gradle -PbuildApp=others buildTask 任务规则

创建的任务都是在 TaskContain 里面,我么可以通过从 Project 的属性 tasks 中根据任务的名称来获取想要获取的任务,可以通过 TaskContain 的 addRule 方法添加相应的任务规则,参考代码如下:

//任务规则 tasks.addRule("对该规则的一个描述"){ //在闭包中常常将->作为参数与代码块之间的分隔符 String taskName -> task(taskName) { doLast{ println "${taskName} 不存在" } } } task taskTest{ dependsOn taskX }

上述代码的执行结果:

PS E:\Gradle\study\GradleTask2> gradle taskTest > Task :taskX taskX 不存在 BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdfsw.html