tags: [android,gradle,CI/CD]
categories: gradle
top: false
toc: true
cover: false
img: /featureImg/gradle.png
summary: 了解task的属性、增量构建和执行顺序


前面的文章已经自定义了一个简单的task,但是要实现现实世界的需求还需要更进一步了解task
本文包含

  • task的简单属性
  • 增量构建
  • task的执行顺序

task的简单属性
先上代码,把所有的属性都定义了再一个个来说明
或者可以直接看 官方文档

  1. task simpleAttrDepend {
  2. doLast {
  3. println("$name")
  4. }
  5. }
  6. task simpleAttr {
  7. }
  8. task simpleAttr(group: "demo", description: "show simple attributes in task", type: DefaultTask
  9. , dependsOn: "simpleAttrDepend", overwrite: true, action: {
  10. println("name:$name description:$description group:$group type:${simpleAttr.class} dependsOn:$dependsOn")
  11. })

打印的结果

  1. name:simpleAttr description:show simple attributes in task group:demo type:class org.gradle.api.DefaultTask_Decorated dependsOn:[simpleAttrDepend]

name

之前文章中说明了task是一个gradle脚本中的关键字,使用task关键字在这里定义了一个名为 simpleAttr 的task

group

设置task的分组,这里设置的分组为 demo ,可以在AndroidStudio的Gradle视图中看到分组的信息
image.png

description

task的描述,说明task的作用

type

type可以指定当前创建的task由哪个类派生出来的,默认是DefaultTask,type属性可以用来指定要配置可增强的Task类

dependsOn

指定当前task需要在指定task之后执行,可以传入数组

overwrite

是否覆盖已有的task,定义了两个名为 simpleAttr 的 task,如果第二个不指定overwrite为true则在配置阶段就会报错

action

可以传入一个闭包,在构建执行阶段处理一些逻辑
至此我们有了四种方式可以给一个task添加action

  • doFirst
  • doLast
  • 使用@TaskAction
  • 使用action参数传入闭包

查找一个task

大部分task都需要依赖其他的task来实现一些功能,所以查找task非常关键
可以通过name和path来查找task

  1. //相当于tasks.findByName
  2. tasks["name"].doLast{
  3. }
  4. //find找不到task会返回null
  5. tasks.findByName("name")
  6. tasks.findByPath(":projectName:taskName")
  7. //get在找不到task时会抛出UnknownTaskException
  8. tasks.getByName("name")
  9. tasks.getByPath(":projectName:taskName")

查找task默认处理

当查找task失败时可以添加默认处理,例如打印一条信息,或者使用默认逻辑创建这个task

  1. //未匹配到task时处理的规则
  2. project.tasks.addRule("missTask") { String taskName ->
  3. project.task(taskName) {
  4. group = "dev_test"
  5. doLast {
  6. println("==========this a missed task name $taskName===========")
  7. }
  8. }
  9. }

输入输出

输入输出和两件事情有关

  • 增量构建
  • 执行顺序

下面的文章对输入输出做了很好的阐述,自己就不再复述了
Authoring Tasks
Gradle学习(十五)——增量构建
Gradle Task UP-TO-DATE

task执行顺序

之前已经提到一些方式可以影响task的执行顺序了

  • dependsOn
  • 输入输出

来看看其他影响task执行的方式

finallizedBy

  1. task taskX {
  2. doLast {
  3. println 'taskX'
  4. throw new RuntimeException()
  5. }
  6. }
  7. task taskY {
  8. doLast {
  9. println 'taskY'
  10. }
  11. }
  12. taskX.finalizedBy taskY

不论taskX执行是否失败,都会执行taskY,类似java中finally代码块

mustRunAfter/shouldRunAfter

这里需要注意下和dependsOn的区别, taskA dependsOn taskB 表示执行taskB之前一定会执行taskA
taskA mustRunAfter taskB 只是表示两个task都需要执行时的顺序,taskA并没有依赖taskB才能执行

  1. gradle -q taskA taskB
  2. taskB
  3. taskA
  4. //只执行taskA时不需要执行taskB
  5. gradle -q taskA
  6. taskA

是否执行task

  • 可以设置task的enable属性为false禁用task
  • 可以通过onlyIf方法/属性传入一个闭包,返回true时才执行

总结

了解了task的基本属性,如何查找task,以及输入输出处理和执行顺序之后我们已经可以开始自定义功能强大的task了。
下一篇文章将介绍下project和task之间的桥梁—Plugin