Task

API 文档Task

一个 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) 用于指定任务之间的顺序。您可以使用以下任何类型的对象来指定依赖项和排序

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

在构建文件中使用任务

动态属性

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

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

一个 Plugin 可以使用其 Convention 对象向 Task 添加方法。

并行执行

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

属性

属性描述
actions

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

ant

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

convention
已废弃

此任务的 Convention 对象。一个 Plugin 可以使用约定对象为该任务贡献属性和方法。

dependsOn

此任务的依赖项。

description

此任务的描述。

destroyables

此任务的可销毁资源。

didWork

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

enabled

返回此任务是否已启用。

extensions

扩展容器。

finalizedBy

返回将最终化此任务的任务。

group

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

inputs

此任务的输入项。

localState

此任务的本地状态。

logger

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

logging

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

mustRunAfter

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

name

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

outputs

此任务的输出项。

path

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

project

此任务所属的 Project

shouldRunAfter

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

state

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

taskDependencies

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

temporaryDir

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

timeout

此任务的超时时间。

方法

方法描述
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)
孵化中

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

onlyIf(onlyIfSpec)

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

property(propertyName)

返回此任务指定属性的值。此方法按如下方式查找属性

setProperty(name, value)

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

shouldRunAfter(paths)

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

usesService(service)

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

脚本块

无脚本块

属性详情

List<Action<? super Task>> actions

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

AntBuilder ant (只读)

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

Convention convention (只读)

注意:此属性已废弃,并将在 Gradle 的下一个主要版本中移除。

此任务的 Convention 对象。一个 Plugin 可以使用约定对象为该任务贡献属性和方法。

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 被重定向到 Gradle 日志系统的 QUIET 日志级别,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 可能会有所更改。

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

您可以添加多个此类断言。如果任何断言返回 false,则跳过该任务。

典型用法(Java)

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

void onlyIf(Spec<? super Task> onlyIfSpec)

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

您可以添加多个此类断言。如果任何断言返回 false,则跳过该任务。

典型用法(Java)

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

Object property(String propertyName)

返回此任务指定属性的值。此方法按如下方式查找属性

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

void setProperty(String name, Object value)

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

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

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

TaskDependency shouldRunAfter(Object... paths)

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

task taskY {
    shouldRunAfter "taskX"
}

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

有关可用于指定排序关系的对象的类型说明,请参阅此处

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

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

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