任务

API 文档任务

一个 Task 代表构建中的一个原子工作单元,例如编译类或生成 Javadoc。

每个任务都属于一个 Project。您可以使用 TaskContainer 上的各种方法来创建和查找任务实例。例如,TaskContainer.create(java.lang.String) 创建一个给定名称的空任务。您也可以在构建文件中使用 task 关键字。

task myTask
task myTask { configure closure }
task myTask(type: SomeType)
task myTask(type: SomeType) { configure closure }

每个任务都有一个名称,可用于在其所属的项目中引用该任务,以及一个完全限定路径,该路径在所有项目的所有任务中都是唯一的。该路径是所属项目的路径和任务名称的连接。路径元素使用 : 字符分隔。

任务操作

一个 Task 由一系列 Action 对象组成。当任务执行时,每个操作都依次通过调用 Action.execute(T) 来执行。您可以通过调用 Task.doFirst(org.gradle.api.Action)Task.doLast(org.gradle.api.Action) 将操作添加到任务中。

Groovy 闭包也可以用于提供任务操作。当操作执行时,闭包将以任务作为参数调用。您可以通过调用 Task.doFirst(groovy.lang.Closure)Task.doLast(groovy.lang.Closure) 将操作闭包添加到任务中。

有两种特殊异常可以由任务操作抛出,以中止执行并继续而不使构建失败。任务操作可以通过抛出 StopActionException 来中止操作的执行并继续到任务的下一个操作。任务操作可以通过抛出 StopExecutionException 来中止任务的执行并继续到下一个任务。使用这些异常可以使您拥有前置条件操作,如果条件不为真,则跳过任务的执行或任务的一部分。

任务依赖和任务排序

一个任务可能依赖于其他任务,或者可能被安排在另一个任务之后始终运行。Gradle 确保在执行任务时,遵守所有任务依赖和排序规则,以便在所有依赖项和任何“必须在之后运行”的任务执行后,该任务才被执行。

对任务的依赖关系通过 Task.dependsOn(java.lang.Object[])Task.setDependsOn(java.lang.Iterable) 控制,而 Task.mustRunAfter(java.lang.Object[])Task.setMustRunAfter(java.lang.Iterable)Task.shouldRunAfter(java.lang.Object[])Task.setShouldRunAfter(java.lang.Iterable) 用于指定任务之间的排序。您可以使用以下任何类型的对象来指定依赖关系和排序:

  • 一个 StringCharSequencegroovy.lang.GString 任务路径或名称。相对路径被解释为相对于任务的 Project。这允许您引用其他项目中的任务。这些任务引用不会导致任务创建。
  • 一个 Task
  • 一个 TaskDependency 对象。
  • 一个 TaskReference 对象。
  • 一个 Buildable 对象。
  • 一个 RegularFilePropertyDirectoryProperty
  • 一个 Provider 对象。可能包含此处列出的任何类型。
  • 一个 IterableCollectionMap 或数组。可能包含此处列出的任何类型。可迭代对象/集合/映射/数组的元素会递归转换为任务。
  • 一个 Callable。其 call() 方法可以返回此处列出的任何类型。其返回值会递归转换为任务。空返回值被视为空集合。
  • 一个 Groovy Closure 或 Kotlin 函数。该闭包可以接受一个 Task 作为参数。该闭包或函数可以返回此处列出的任何类型。其返回值会递归转换为任务。空返回值被视为空集合。
  • 其他任何情况都被视为错误。

在构建文件中使用任务

动态属性

一个 Task 有 4 个属性“范围”。您可以通过名称从构建文件访问这些属性,或者通过调用 Task.property(java.lang.String) 方法。您可以通过调用 Task.setProperty(java.lang.String, java.lang.Object) 方法更改这些属性的值。

  • Task 对象本身。这包括由 Task 实现类声明的任何属性 getter 和 setter。此范围的属性根据相应 getter 和 setter 方法的存在性可读或可写。
  • 通过插件添加到任务的扩展。每个扩展都作为只读属性提供,其名称与扩展相同。
  • 任务的额外属性。每个任务对象都维护一个附加属性的映射。这些是任意的名称 -> 值对,您可以使用它们动态地向任务对象添加属性。一旦定义,此范围的属性即可读写。

并行执行

默认情况下,任务不会并行执行,除非一个任务正在等待异步工作而另一个任务(非依赖任务)已准备好执行。在启动构建时,可以通过 --parallel 标志启用并行执行。在并行模式下,不同项目的任务(即多项目构建中)可以并行执行。

属性

属性描述
操作

将由该任务执行的 Action 对象序列,按执行顺序。

蚂蚁

此任务的 AntBuilder。您可以在构建文件中使用它来执行 Ant 任务。

依赖于

此任务的依赖项。

描述

此任务的描述。

可销毁对象

此任务的可销毁项。

didWork

检查任务是否实际执行了任何工作。即使任务执行,它也可能确定没有要做的事情。例如,编译任务可能确定自上次运行任务以来源文件没有更改。

已启用

返回此任务是否启用。

扩展

扩展容器。

finalizedBy

返回完成此任务的任务。

此任务所属的任务组。任务组用于报告和用户界面中,以便在向用户呈现任务列表时,将相关任务分组在一起。

输入

此任务的输入。

本地状态

此任务的本地状态。

记录器

此任务的记录器。您可以在构建文件中使用它来写入日志消息。

日志

LoggingManager,可用于接收日志记录并控制此任务的标准输出/错误捕获。默认情况下,System.out 会以 QUIET 日志级别重定向到 Gradle 日志系统,System.err 会以 ERROR 日志级别重定向。

必须在之后运行

返回此任务必须在之后运行的任务。

名称

此任务的名称。该名称在其 Project 中唯一标识该任务。

输出

此任务的输出。

路径

任务的路径,这是任务的完全限定名称。任务的路径是其 Project 的路径加上任务的名称,用 : 分隔。

项目

此任务所属的 Project

应该在之后运行

返回此任务应该在之后运行的任务。

状态

此任务的执行状态。这提供了有关此任务执行的信息,例如它是否已执行、已跳过、已失败等。

任务依赖项

返回一个 TaskDependency,其中包含此任务依赖的所有任务。

临时目录

返回此任务可用于写入临时文件的目录。每个任务实例都提供一个单独的临时目录。不保证此目录的内容在任务执行之后会保留。

超时

此任务的超时。

方法

方法描述
dependsOn(paths)

将给定的依赖项添加到此任务。有关可用作任务依赖项的对象的类型描述,请参阅此处

doFirst(action)

将给定的闭包添加到此任务操作列表的开头。闭包在执行时将此任务作为参数传递。

doFirst(actionName, action)

将给定的 Action 添加到此任务操作列表的开头。

doFirst(action)

将给定的 Action 添加到此任务操作列表的开头。

doLast(action)

将给定的闭包添加到此任务操作列表的末尾。闭包在执行时将此任务作为参数传递。

doLast(actionName, action)

将给定的 Action 添加到此任务操作列表的末尾。

doLast(action)

将给定的 Action 添加到此任务操作列表的末尾。

doNotTrackState(reasonNotToTrackState)

不跟踪任务的状态。

finalizedBy(paths)

为此任务添加给定的最终化任务。

hasProperty(propertyName)

确定此任务是否具有给定属性。有关任务可用属性的详细信息,请参阅此处

mustRunAfter(paths)

指定此任务必须在所有提供的任务之后运行。

onlyIf(onlyIfClosure)

仅当给定闭包返回 true 时才执行任务。闭包将在任务执行时评估,而不是在配置期间。闭包将以此任务作为单个参数传递。如果闭包返回 false,则任务将被跳过。

onlyIf(onlyIfReason, onlyIfSpec)
孵化中

仅当给定规范满足时才执行任务。该规范将在任务执行时评估,而不是在配置期间。如果规范不满足,则任务将被跳过。

onlyIf(onlyIfSpec)

仅当给定规范满足时才执行任务。该规范将在任务执行时评估,而不是在配置期间。如果规范不满足,则任务将被跳过。

property(propertyName)

返回此任务给定属性的值。此方法按以下方式查找属性:

setProperty(name, value)

设置此任务的属性。此方法在以下位置搜索具有给定名称的属性,并在找到属性的第一个位置设置该属性。

shouldRunAfter(paths)

指定此任务应在所有提供的任务之后运行。

usesService(service)

注册此任务使用的 BuildService,以便可以遵守 BuildServiceRegistration.getMaxParallelUsages()

脚本块

无脚本块

属性详情

List<Action<? super Task>> actions

将由该任务执行的 Action 对象序列,按执行顺序。

AntBuilder ant (只读)

此任务的 AntBuilder。您可以在构建文件中使用它来执行 Ant 任务。

Set<Object> dependsOn

此任务的依赖项。

String description

此任务的描述。

TaskDestroyables destroyables (只读)

此任务的可销毁项。

boolean didWork

检查任务是否实际执行了任何工作。即使任务执行,它也可能确定没有要做的事情。例如,编译任务可能确定自上次运行任务以来源文件没有更改。

boolean enabled

返回此任务是否启用。

ExtensionContainer extensions (只读)

扩展容器。

TaskDependency finalizedBy

返回完成此任务的任务。

String group

此任务所属的任务组。任务组用于报告和用户界面中,以便在向用户呈现任务列表时,将相关任务分组在一起。

TaskInputs inputs (只读)

此任务的输入。

TaskLocalState localState (只读)

此任务的本地状态。

Logger logger (只读)

此任务的记录器。您可以在构建文件中使用它来写入日志消息。

LoggingManager logging (只读)

LoggingManager,可用于接收日志记录并控制此任务的标准输出/错误捕获。默认情况下,System.out 会以 QUIET 日志级别重定向到 Gradle 日志系统,System.err 会以 ERROR 日志级别重定向。

TaskDependency mustRunAfter

返回此任务必须在之后运行的任务。

String name (只读)

此任务的名称。该名称在其 Project 中唯一标识该任务。

TaskOutputs outputs (只读)

此任务的输出。

String path (只读)

任务的路径,这是任务的完全限定名称。任务的路径是其 Project 的路径加上任务的名称,用 : 分隔。

Project project (只读)

此任务所属的 Project

当配置缓存启用时,不支持从任务操作中调用此方法。

TaskDependency shouldRunAfter

返回此任务应该在之后运行的任务。

TaskState state (只读)

此任务的执行状态。这提供了有关此任务执行的信息,例如它是否已执行、已跳过、已失败等。

TaskDependency taskDependencies (只读)

返回一个 TaskDependency,其中包含此任务依赖的所有任务。

当配置缓存启用时,不支持从任务操作中调用此方法。

File temporaryDir (只读)

返回此任务可用于写入临时文件的目录。每个任务实例都提供一个单独的临时目录。不保证此目录的内容在任务执行之后会保留。

此任务的超时。

  task myTask {
      timeout = Duration.ofMinutes(10)
  }

如果此任务的运行时间超过指定的时间量,则执行此任务的线程将被中断。为了使任务与此功能正常工作,它需要对中断做出反应,并且必须清理其打开的任何资源。

默认情况下,任务永不超时。

方法详情

Task dependsOn(Object... paths)

将给定的依赖项添加到此任务。有关可用作任务依赖项的对象的类型描述,请参阅此处

Task doFirst(Closure action)

将给定的闭包添加到此任务操作列表的开头。闭包在执行时将此任务作为参数传递。

Task doFirst(String actionName, Action<? super Task> action)

将给定的 Action 添加到此任务操作列表的开头。

Task doFirst(Action<? super Task> action)

将给定的 Action 添加到此任务操作列表的开头。

Task doLast(Closure action)

将给定的闭包添加到此任务操作列表的末尾。闭包在执行时将此任务作为参数传递。

Task doLast(String actionName, Action<? super Task> action)

将给定的 Action 添加到此任务操作列表的末尾。

Task doLast(Action<? super Task> action)

将给定的 Action 添加到此任务操作列表的末尾。

void doNotTrackState(String reasonNotToTrackState)

不跟踪任务的状态。

指示 Gradle 将任务视为未跟踪。

Task finalizedBy(Object... paths)

为此任务添加给定的最终化任务。

task taskY {
    finalizedBy "taskX"
}

有关可用作最终化任务的对象的类型描述,请参阅此处

boolean hasProperty(String propertyName)

确定此任务是否具有给定属性。有关任务可用属性的详细信息,请参阅此处

Task mustRunAfter(Object... paths)

指定此任务必须在所有提供的任务之后运行。

task taskY {
    mustRunAfter "taskX"
}

对于每个提供的任务,此操作添加一个任务“排序”,但不指定任务之间的“依赖关系”。因此,在示例中仍然可以在不先执行“taskX”的情况下执行“taskY”。

有关可用作指定排序关系的对象类型描述,请参阅此处

void onlyIf(Closure<?> onlyIfClosure)

仅当给定闭包返回 true 时才执行任务。闭包将在任务执行时评估,而不是在配置期间。闭包将以此任务作为单个参数传递。如果闭包返回 false,则任务将被跳过。

您可以添加多个此类谓词。如果任何谓词返回 false,则任务将被跳过。

典型用法:myTask.onlyIf { isProductionEnvironment() }

void onlyIf(String onlyIfReason, Spec<? super Task> onlyIfSpec)

注意:此方法处于孵化中,可能会在 Gradle 的未来版本中更改。

仅当给定规范满足时才执行任务。该规范将在任务执行时评估,而不是在配置期间。如果规范不满足,则任务将被跳过。

您可以添加多个此类谓词。如果任何谓词返回 false,则任务将被跳过。

典型用法(来自 Java)

myTask.onlyIf("run only in production environment", new Spec<Task>() {
   boolean isSatisfiedBy(Task task) {
      return isProductionEnvironment();
   }
});

void onlyIf(Spec<? super Task> onlyIfSpec)

仅当给定规范满足时才执行任务。该规范将在任务执行时评估,而不是在配置期间。如果规范不满足,则任务将被跳过。

您可以添加多个此类谓词。如果任何谓词返回 false,则任务将被跳过。

典型用法(来自 Java)

myTask.onlyIf(new Spec<Task>() {
   boolean isSatisfiedBy(Task task) {
      return isProductionEnvironment();
   }
});

Object property(String propertyName)

返回此任务给定属性的值。此方法按以下方式查找属性:

  1. 如果此任务对象具有给定名称的属性,则返回该属性的值。
  2. 如果此任务具有给定名称的扩展,则返回该扩展。
  3. 如果此任务具有给定名称的额外属性,则返回该属性的值。
  4. 如果未找到,则抛出 MissingPropertyException

void setProperty(String name, Object value)

设置此任务的属性。此方法在以下位置搜索具有给定名称的属性,并在找到属性的第一个位置设置该属性。

  1. 任务对象本身。例如,enabled 项目属性。
  2. 任务的额外属性。

如果未找到该属性,则抛出 MissingPropertyException

TaskDependency shouldRunAfter(Object... paths)

指定此任务应在所有提供的任务之后运行。

task taskY {
    shouldRunAfter "taskX"
}

对于每个提供的任务,此操作添加一个任务“排序”,但不指定任务之间的“依赖关系”。因此,在示例中仍然可以在不先执行“taskX”的情况下执行“taskY”。

有关可用作指定排序关系的对象类型描述,请参阅此处

void usesService(Provider<? extends BuildService<?>> service)

注册此任务使用的 BuildService,以便可以遵守 BuildServiceRegistration.getMaxParallelUsages()

对于声明为 ServiceReference 的任务属性,这是不必要的。