Gradle 可以在项目上执行的工作由一个或多个 任务 定义。

任务代表构建执行的某个独立工作单元。这可能是编译某些类、创建 JAR、生成 Javadoc 或将某些归档发布到仓库。
当用户在命令行运行 ./gradlew build
时,Gradle 将执行 build
任务以及它依赖的任何其他任务。
列出可用任务
Gradle 为项目提供了几个默认任务,可以通过运行 ./gradlew tasks
来列出它们。
> Task :tasks
------------------------------------------------------------
Tasks runnable from root project 'myTutorial'
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'myTutorial'.
...
任务来自 构建脚本 或 插件。
一旦我们对项目应用了插件(例如 application
插件),就会有额外的任务可用。
plugins {
id("application")
}
plugins {
id 'application'
}
$ ./gradlew tasks
> Task :tasks
------------------------------------------------------------
Tasks runnable from project ':app'
------------------------------------------------------------
Application tasks
-----------------
run - Runs this project as a JVM application
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
Other tasks
-----------
compileJava - Compiles main Java source.
...
其中许多任务,例如 assemble
、build
和 run
,对于开发人员来说应该很熟悉。
任务分类
有两种类型的任务可以执行:
-
可执行任务 (Actionable tasks) 附带一个或多个用于在构建中完成工作的动作:
compileJava
。 -
生命周期任务 (Lifecycle tasks) 是未附加动作的任务:
assemble
、build
。
通常,生命周期任务依赖于许多可执行任务,用于一次执行多个任务。
任务注册和动作
让我们看一个简单的“Hello World”任务,它位于构建脚本中:
tasks.register("hello") {
doLast {
println("Hello world!")
}
}
tasks.register('hello') {
doLast {
println 'Hello world!'
}
}
在这个示例中,构建脚本使用 TaskContainer API 注册了一个名为 hello
的任务,并为其添加了一个动作。
如果列出项目中的任务,则 hello
任务对 Gradle 可用。
$ ./gradlew app:tasks --all
> Task :app:tasks
------------------------------------------------------------
Tasks runnable from project ':app'
------------------------------------------------------------
Other tasks
-----------
compileJava - Compiles main Java source.
compileTestJava - Compiles test Java source.
hello
processResources - Processes main resources.
processTestResources - Processes test resources.
startScripts - Creates OS-specific scripts to run the project as a JVM application.
您可以使用 ./gradlew hello
在构建脚本中执行该任务。
$ ./gradlew hello
Hello world!
当 Gradle 执行 hello
任务时,它会执行提供的动作。在本例中,该动作只是一个包含一些代码的块:println("Hello world!")
。
任务组和描述
可以通过以下更新,为上一节中的 hello
任务添加描述并分配到组:
tasks.register("hello") {
group = "Custom"
description = "A lovely greeting task."
doLast {
println("Hello world!")
}
}
tasks.register('hello') {
group = 'Custom'
description = 'A lovely greeting task.'
doLast {
println 'Hello world!'
}
}
一旦任务被分配到组,它将由 ./gradlew tasks
列出。
$ ./gradlew tasks
> Task :tasks
Custom tasks
------------------
hello - A lovely greeting task.
要查看有关任务的信息,请使用 help --task <task-name>
命令:
$./gradlew help --task hello
> Task :help
Detailed task information for hello
Path
:app:hello
Type
Task (org.gradle.api.Task)
Options
--rerun Causes the task to be re-run even if up-to-date.
Description
A lovely greeting task.
Group
Custom
正如我们所见,hello
任务属于 custom
组。
任务依赖项
您可以声明依赖于其他任务的任务:
tasks.register("hello") {
doLast {
println("Hello world!")
}
}
tasks.register("intro") {
dependsOn("hello")
doLast {
println("I'm Gradle")
}
}
tasks.register('hello') {
doLast {
println 'Hello world!'
}
}
tasks.register('intro') {
dependsOn tasks.hello
doLast {
println "I'm Gradle"
}
}
$ gradle -q intro Hello world! I'm Gradle
taskX
对 taskY
的依赖可以在定义 taskY
之前声明。
tasks.register("taskX") {
dependsOn("taskY")
doLast {
println("taskX")
}
}
tasks.register("taskY") {
doLast {
println("taskY")
}
}
tasks.register('taskX') {
dependsOn 'taskY'
doLast {
println 'taskX'
}
}
tasks.register('taskY') {
doLast {
println 'taskY'
}
}
$ gradle -q taskX taskY taskX
上一示例中的 hello
任务已更新以包含依赖项:
tasks.register("hello") {
group = "Custom"
description = "A lovely greeting task."
doLast {
println("Hello world!")
}
dependsOn(tasks.assemble)
}
tasks.register('hello') {
group = "Custom"
description = "A lovely greeting task."
doLast {
println("Hello world!")
}
dependsOn(tasks.assemble)
}
现在 hello
任务依赖于 assemble
任务,这意味着 Gradle 必须在执行 hello
任务之前执行 assemble
任务。
$ ./gradlew :app:hello
> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:hello
Hello world!
任务配置
任务注册后,可以通过 TaskProvider API 进行进一步配置。
例如,您可以使用它在运行时动态地向任务添加依赖项:
repeat(4) { counter ->
tasks.register("task$counter") {
doLast {
println("I'm task number $counter")
}
}
}
tasks.named("task0") { dependsOn("task2", "task3") }
4.times { counter ->
tasks.register("task$counter") {
doLast {
println "I'm task number $counter"
}
}
}
tasks.named('task0') { dependsOn('task2', 'task3') }
$ gradle -q task0 I'm task number 2 I'm task number 3 I'm task number 0
或者您可以向现有任务添加行为:
tasks.register("hello") {
doLast {
println("Hello Earth")
}
}
tasks.named("hello") {
doFirst {
println("Hello Venus")
}
}
tasks.named("hello") {
doLast {
println("Hello Mars")
}
}
tasks.named("hello") {
doLast {
println("Hello Jupiter")
}
}
tasks.register('hello') {
doLast {
println 'Hello Earth'
}
}
tasks.named('hello') {
doFirst {
println 'Hello Venus'
}
}
tasks.named('hello') {
doLast {
println 'Hello Mars'
}
}
tasks.named('hello') {
doLast {
println 'Hello Jupiter'
}
}
$ gradle -q hello Hello Venus Hello Earth Hello Mars Hello Jupiter
doFirst 和 doLast 调用可以执行多次。它们将动作添加到任务动作列表的开头或结尾。当任务执行时,动作列表中的动作按顺序执行。 |
以下是使用 named
方法配置由插件添加的任务的示例:
tasks.dokkaHtml.configure {
outputDirectory.set(buildDir)
}
tasks.named("dokkaHtml") {
outputDirectory.set(buildDir)
}
任务类型
Gradle 任务是 Task
的子类。
在构建脚本中,通过继承 DefaultTask
创建了 HelloTask
类:
// Extend the DefaultTask class to create a HelloTask class
abstract class HelloTask : DefaultTask() {
@TaskAction
fun hello() {
println("hello from HelloTask")
}
}
// Register the hello Task with type HelloTask
tasks.register<HelloTask>("hello") {
group = "Custom tasks"
description = "A lovely greeting task."
}
// Extend the DefaultTask class to create a HelloTask class
class HelloTask extends DefaultTask {
@TaskAction
void hello() {
println("hello from HelloTask")
}
}
// Register the hello Task with type HelloTask
tasks.register("hello", HelloTask) {
group = "Custom tasks"
description = "A lovely greeting task."
}
hello
任务注册时指定了 类型 HelloTask
。
执行我们的新 hello
任务:
$ ./gradlew hello
> Task :app:hello
hello from HelloTask
现在 hello
任务的类型是 HelloTask
,而不是 Task
。
Gradle 的 help
任务显示了这一变化:
$ ./gradlew help --task hello
> Task :help
Detailed task information for hello
Path
:app:hello
Type
HelloTask (Build_gradle$HelloTask)
Options
--rerun Causes the task to be re-run even if up-to-date.
Description
A lovely greeting task.
Group
Custom tasks
内置任务类型
Gradle 提供了许多内置任务类型,具有常见和流行的功能,例如复制或删除文件。
这个示例任务使用 Copy
内置任务将 source
目录中的 *.war
文件复制到 target
目录:
tasks.register<Copy>("copyTask") {
from("source")
into("target")
include("*.war")
}
tasks.register('copyTask', Copy) {
from("source")
into("target")
include("*.war")
}
开发人员可以利用许多任务类型,包括在 DSL 中可用的 GroovyDoc
、Zip
、Jar
、JacocoReport
、Sign
或 Delete
。
下一步: 学习如何编写任务 >>