任务

Gradle 中 Task 详解

Gradle 的 Project 从本质上说只是含有多个 Task 的容器,一个 Task 与 Ant 的 Target 相似,表示一个逻辑上的执行单元。让我们来看看 Gradle API 中任务的表示:org.gradle.api.Task 接口。

我们可以通过很多种方式定义 Task,所有的 Task 都存放在 Project 的 TaskContainer 中。让我们来看一个最简单的 Task,创建一个 build.gradle 文件,内容如下:

task helloWorld << {
   println "Hello World!"
}

这里的“«”表示向 helloWorld 中加入执行代码——其实就是 groovy 代码。Gradle 向我们提供了一整套 DSL,所以在很多时候我们写的代码似乎已经脱离了 groovy,但是在底层依然是执行的 groovy。比如上面的 task 关键字,其实就是一个 groovy 中的方法,而大括号之间的内容则表示传递给 task()方法的一个闭包。除了“«”之外,我们还很多种方式可以定义一个 Task,我们将在本系列后续的文章中讲到。 在与 build.gradle 相同的目录下执行:

gradle helloWorld

命令行输出如下:

:helloWorld
Hello World!
BUILD SUCCESSFUL
Total time: 2.544 secs

在默认情况下,Gradle 将当前目录下的 build.gradle 文件作为项目的构建文件。在上面的例子中,我们创建了一个名为 helloWorld 的 Task,在执行 gradle 命令时,我们指定执行这个 helloWorld Task。这里的 helloWorld 是一个 DefaultTask 类型的对象,这也是定义一个 Task 时的默认类型,当然我们也可以显式地声明 Task 的类型,甚至可以自定义一个 Task 类型。

内置任务

Gradle 在默认情况下为我们提供了几个常用的 Task,比如查看 Project 的 Properties、显示当前 Project 中定义的所有 Task 等。可以通过一下命令查看 Project 中所有的 Task:

gradle tasks

输出如下:

:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
setupBuild - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
dependencies - Displays all dependencies declared in root project 'gradle-blog'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-blog'.
help - Displays a help message
projects - Displays the sub-projects of root project 'gradle-blog'.
properties - Displays the properties of root project 'gradle-blog'.
tasks - Displays the tasks runnable from root project 'gradle-blog'.

Other tasks
-----------
copyFile
helloWorld

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 2.845 secs

上面的 other tasks 中列举出来的 task 即是我们自定义的 tasks。

任务定义

Grade 提供了非常灵活的 Task 定义方式,可以适用于不同的应用场景或者编程风格。

task(hello) << {
    println "hello"
}

task(copy, type: Copy) {
    from(file('srcDir'))
    into(buildDir)
}

//也可以用字符串作为任务名

task('hello') <<
{
    println "hello"
}

task('copy', type: Copy) {
    from(file('srcDir'))
    into(buildDir)
}

//Defining tasks with alternative syntax

tasks.create(name: 'hello') << {
    println "hello"
}

tasks.create(name: 'copy', type: Copy) {
    from(file('srcDir'))
    into(buildDir)
}

上述代码中使用了 << 符号用来表征 {} 声明的动作是追加在某个任务的末尾,如果使用全声明即是:

task printVersion {
    // 任务的初始声明可以添加 first 和 last 动作
    doFirst {
        println "Before reading the project version"
    }

    doLast {
        println "Version: $version"
    }
}

Default tasks(默认任务)

Gradle 允许在脚本中配置默认的一到多个任务来响应没有带参数的 gradle 命令:

defaultTasks 'clean', 'run'

task clean << {
    println 'Default Cleaning!'
}

task run << {
    println 'Default Running!'
}

task other << {
    println "I'm not a default task!"
}

gradle -q命令的输出:

> gradle -q
Default Cleaning!
Default Running!

任务依赖

任务的生命周期

上一页
下一页