持续创作,加速成长!这是我参与「掘金日新计划 · 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 执行过程中抛出以下异常,将跳过执行并继续后续的构建过程:
-
- StopActionException : 中断当前 Action,并继续当前 Task 的下一个 Action;
- StopExecutionException : 中断当前 Task,并继续 Task 依赖树上的下一个 Action。
- 4、timeouts 属性: 当 Task 执行时间到达 timeouts 超时时间时,执行线程会收到一个中断信号,可以借此许控制 Task 的执行时间(前提是 Task 要响应中断信号)。