实现增强TASK的操作

136 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

Task 核心API

创建简单 Task

通过 task 关键字

// 创建名为 MyTask 的任务
task MyTask(group: "MyGroup") {
    // Task 配置代码
}

通过 TaskContainer 方法

通过 Project 的 TaskContainer 属性,可以创建 Task,分为热创建和懒创建:

  • Task create(String, Closure) 热创建: 立即实例化 Task 对象;
  • TaskProvider register(String, Closure) 懒创建: 注册 Task 构造器,但不会实例化对象。创建 Task 操作会延迟到访问该 Task 时,例如通过 TaskProvider#get() 或 TaskContainer#getByName()。
// 创建名为 MyTask 的任务
project.tasks.create(name: "MyTask") {
    // Task 配置代码
}

创建增强 Task(自定义 Task 类型)

除了简单创建 Task 的方式,我们还可以自定义 Task 类型,Gradle 将这类 Task 称为增强 Task。增强 Task 的可重用性更好,并且可以通过暴露属性的方式来定制 Task 的行为。

  • 1、DefaultTask: 自定义 Task 必须继承 DefaultTask。
class CustomTask extends DefaultTask {    
    final String message     
    final int number 
}
  • 2、带参数创建 Task: 除了可以在创建 Task 后配置属性值,我们也可以在调用 TaskContainer#create() 时传递构造器参数。为了将值传递给任务构造函数,必须使用 @Inject 注解修饰构造器。
class CustomTask extends DefaultTask {     
  final String message     
  final int number    
  @Inject     
  CustomTask(String message, int number) {         
      this.message = message        
      this.number = number    
  }
} 

// 第二个参数为 Task 类型 
tasks.register('myTask', CustomTask, 'hello', 42)

Task执行

通过添加doFirst或者doLast。

对于自定义 Task,还可以通过 @TaskAction 注解添加默认 Action。例如:

abstract class CustomTask extends DefaultTask {    
    @TaskAction     
    def greet() {         
          println 'hello from GreetingTask'     
        } 
}

跳过 Task 的执行

并不是所有 Task 都会被执行,Gradle 提供了多个方法来控制跳过 Task 的执行:

  • 1、onlyIf{}: 闭包会在即将执行 Task 之前执行,闭包返回值决定了是否执行 Task;
  • 2、enabled 属性: Task 的 enabled 属性默认为 true,设置为 false 表示无效任务,不需要执行。

剩下两种方式允许在执行 Task 的过程中中断执行:

  • 3、Task 异常: Task 提供了两个异常,能够当 Action 执行过程中抛出以下异常,将跳过执行并继续后续的构建过程:
  • 4、timeouts 属性: 当 Task 执行时间到达 timeouts 超时时间时,执行线程会收到一个中断信号,可以借此许控制 Task 的执行时间(前提是 Task 要响应中断信号)。