任务

GradleTask详解

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

我们可以通过很多种方式定义Task,所有的Task都存放在ProjectTaskContainer中。让我们来看一个最简单的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文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloWorldTask,在执行gradle命令时,我们指定执行这个helloWorld Task。这里的helloWorld是一个DefaultTask类型的对象,这也是定义一个Task时的默认类型,当然我们也可以显式地声明Task的类型,甚至可以自定义一个Task类型。

内置任务

Gradle在默认情况下为我们提供了几个常用的Task,比如查看ProjectProperties、显示当前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!

任务依赖

任务的生命周期

上一页
下一页