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")
}$ ./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
任务分类
可以执行两类任务:
- 
可操作的任务附加了一些操作来在您的构建中完成工作: compileJava。
- 
生命周期任务是没有附加操作的任务: assemble,build。
通常,生命周期任务取决于许多可操作的任务,并且用于一次执行许多任务。
任务注册和行动
让我们看一下构建脚本中的一个简单的“Hello World”任务:
tasks.register("hello") {
    doLast {
        println("Hello world!")
    }
}tasks.register('hello') {
    doLast {
        println 'Hello world!'
    }
}在示例中,构建脚本注册hello一个使用TaskContainer API调用的单个任务,并向其添加一个操作。
如果列出了项目中的任务,则该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!")
    }
}将任务分配给组后,它将按以下方式列出./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
taskXto的依赖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)
}现在任务hello依赖于assemble任务,这意味着 Gradle 必须先assemble执行任务才能执行任务:hello
$ ./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.named("dokkaHtml") {
    outputDirectory.set(buildDir.resolve("dokka"))
}任务类型
Gradle 任务是Task.
在构建脚本中,HelloTask该类是通过扩展创建的DefaultTask:
// 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."
}该hello任务已注册为type HelloTask。
执行我们的新hello任务:
$ ./gradlew hello
> Task :app:hello
hello from HelloTask现在hello任务是 typeHelloTask而不是 type Task。
Gradlehelp任务揭示了变化:
$ ./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