Skip to content

任务基础

Task(任务)是 Gradle 构建的基本执行单元。每一个构建操作(编译、测试、打包)都是一个 Task。

定义任务

方式一:register(推荐)

kotlin
// build.gradle.kts
tasks.register("hello") {
    group = "demo"
    description = "打印 Hello World"
    doLast {
        println("Hello, Gradle!")
    }
}
bash
./gradlew hello
# > Task :hello
# Hello, Gradle!

方式二:register 带类型

kotlin
tasks.register<Copy>("copyDocs") {
    from("src/docs")
    into("$buildDir/docs")
}

tasks.register<Exec>("runScript") {
    commandLine("python", "scripts/generate.py")
}

方式三:named(配置已有任务)

kotlin
// 配置由插件创建的现有任务
tasks.named<Test>("test") {
    useJUnitPlatform()
    maxHeapSize = "1g"
}

tasks.named("jar") {
    // 不知道类型时的配置
}

任务动作(Actions)

每个 Task 可以有多个动作,按顺序执行:

kotlin
tasks.register("multiAction") {
    doFirst {
        println("第一个 doFirst")
    }
    doFirst {
        println("第二个 doFirst(倒序执行,这个先执行)")
    }
    doLast {
        println("第一个 doLast(正序执行,这个先执行)")
    }
    doLast {
        println("第二个 doLast")
    }
}

执行结果:

第二个 doFirst(倒序执行,这个先执行)
第一个 doFirst
第一个 doLast(正序执行,这个先执行)
第二个 doLast

任务的基本属性

kotlin
tasks.register("myTask") {
    group = "my-group"          // 任务分组(./gradlew tasks 时显示)
    description = "任务的描述"   // 帮助信息
    enabled = true              // 是否启用(false 则跳过)
    
    doLast {
        println("任务名称: $name")
        println("任务路径: $path")
        println("任务分组: $group")
    }
}

查看所有任务

bash
# 查看分组显示的任务
./gradlew tasks

# 查看所有任务(含内部任务)
./gradlew tasks --all

# 查看特定任务的帮助
./gradlew help --task compileJava

输出示例:

Demo tasks
----------
hello - 打印 Hello World
multiAction - 演示多动作

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
...

禁用和跳过任务

kotlin
// 禁用任务(每次都跳过)
tasks.named("javadoc") {
    enabled = false
}

// 根据条件跳过
tasks.named("deploy") {
    onlyIf { project.hasProperty("prod") }
    doLast { println("部署中...") }
}

// 命令行跳过
// ./gradlew build -x test

获取任务实例

kotlin
// 获取任务引用,用于在其他地方操作
val compileJava = tasks.named<JavaCompile>("compileJava")

tasks.register("afterCompile") {
    dependsOn(compileJava)
    doLast {
        println("编译完成,输出目录:${compileJava.get().destinationDirectory.get()}")
    }
}

动态创建任务

kotlin
// 批量创建环境相关任务
listOf("dev", "test", "prod").forEach { env ->
    tasks.register("deploy${env.capitalize()}") {
        group = "deploy"
        description = "部署到 $env 环境"
        doLast {
            println("正在部署到 $env...")
        }
    }
}

下一步