Gradle 任务通过扩展 DefaultTask 创建。

然而,通用的 DefaultTask 没有为 Gradle 提供任何操作。如果用户想要扩展 Gradle 及其构建脚本的功能,他们必须使用内置任务或创建自定义任务

  1. 内置任务 - Gradle 提供了内置的实用工具任务,例如 CopyJarZipDelete 等。

  2. 自定义任务 - Gradle 允许用户继承 DefaultTask 来创建他们自己的任务类型。

创建任务

创建自定义任务最简单快捷的方法是在构建脚本中

要创建任务,请从 DefaultTask 类继承并实现一个 @TaskAction 处理程序

build.gradle.kts
abstract class CreateFileTask : DefaultTask() {
    @TaskAction
    fun action() {
        val file = File("myfile.txt")
        file.createNewFile()
        file.writeText("HELLO FROM MY TASK")
    }
}
build.gradle
class CreateFileTask extends DefaultTask {
    @TaskAction
    void action() {
        def file = new File("myfile.txt")
        file.createNewFile()
        file.text = "HELLO FROM MY TASK"
    }
}

CreateFileTask 实现了一组简单的操作。首先,在主项目中创建一个名为 "myfile.txt" 的文件。然后,将一些文本写入文件。

注册任务

任务在构建脚本中使用 TaskContainer.register() 方法注册,这使其随后可以在构建逻辑中使用。

build.gradle.kts
abstract class CreateFileTask : DefaultTask() {
    @TaskAction
    fun action() {
        val file = File("myfile.txt")
        file.createNewFile()
        file.writeText("HELLO FROM MY TASK")
    }
}

tasks.register<CreateFileTask>("createFileTask")
build.gradle
class CreateFileTask extends DefaultTask {
    @TaskAction
    void action() {
        def file = new File("myfile.txt")
        file.createNewFile()
        file.text = "HELLO FROM MY TASK"
    }
}

tasks.register("createFileTask", CreateFileTask)

任务组和描述

在任务上设置 groupdescription 属性可以帮助用户理解如何使用您的任务

build.gradle.kts
abstract class CreateFileTask : DefaultTask() {
    @TaskAction
    fun action() {
        val file = File("myfile.txt")
        file.createNewFile()
        file.writeText("HELLO FROM MY TASK")
    }
}

tasks.register<CreateFileTask>("createFileTask") {
    group = "custom"
    description = "Create myfile.txt in the current directory"
}
build.gradle
class CreateFileTask extends DefaultTask {
    @TaskAction
    void action() {
        def file = new File("myfile.txt")
        file.createNewFile()
        file.text = "HELLO FROM MY TASK"
    }
}

tasks.register("createFileTask", CreateFileTask) {
    group = "custom"
    description = "Create myfile.txt in the current directory"
}

一旦任务被添加到组,它在列出任务时是可见的。

任务输入和输出

为了使任务执行有用的工作,它通常需要一些输入。一个任务通常产生输出

build.gradle.kts
abstract class CreateAFileTask : DefaultTask() {
    @get:Input
    abstract val fileText: Property<String>

    @Input
    val fileName = "myfile.txt"

    @OutputFile
    val myFile: File = File(fileName)

    @TaskAction
    fun action() {
        myFile.createNewFile()
        myFile.writeText(fileText.get())
    }
}
build.gradle
abstract class CreateAFileTask extends DefaultTask {
    @Input
    abstract Property<String> getFileText()

    @Input
    final String fileName = "myfile.txt"

    @OutputFile
    final File myFile = new File(fileName)

    @TaskAction
    void action() {
        myFile.createNewFile()
        myFile.text = fileText.get()
    }
}

配置任务

可以选择在构建脚本中使用 TaskCollection.named() 方法配置任务。

更新了 CreateAFileTask 类,以便文件中的文本是可配置的

build.gradle.kts
abstract class CreateAFileTask : DefaultTask() {
    @get:Input
    abstract val fileText: Property<String>

    @Input
    val fileName = "myfile.txt"

    @OutputFile
    val myFile: File = File(fileName)

    @TaskAction
    fun action() {
        myFile.createNewFile()
        myFile.writeText(fileText.get())
    }
}

tasks.register<CreateAFileTask>("createAFileTask") {
    group = "custom"
    description = "Create myfile.txt in the current directory"
    fileText.convention("HELLO FROM THE CREATE FILE TASK METHOD") // Set convention
}

tasks.named<CreateAFileTask>("createAFileTask") {
    fileText.set("HELLO FROM THE NAMED METHOD") // Override with custom message
}
build.gradle
abstract class CreateAFileTask extends DefaultTask {
    @Input
    abstract Property<String> getFileText()

    @Input
    final String fileName = "myfile.txt"

    @OutputFile
    final File myFile = new File(fileName)

    @TaskAction
    void action() {
        myFile.createNewFile()
        myFile.text = fileText.get()
    }
}

tasks.register("createAFileTask", CreateAFileTask) {
    group = "custom"
    description = "Create myfile.txt in the current directory"
    fileText.convention("HELLO FROM THE CREATE FILE TASK METHOD") // Set convention
}

tasks.named("createAFileTask", CreateAFileTask) {
    fileText.set("HELLO FROM THE NAMED METHOD") // Override with custom message
}

named() 方法中,我们找到 createAFileTask 任务并设置将写入文件的文本。

当任务执行时

$ ./gradlew createAFileTask

> Configure project :app

> Task :app:createAFileTask

BUILD SUCCESSFUL in 5s
2 actionable tasks: 1 executed, 1 up-to-date

在项目根文件夹中创建一个名为 myfile.txt 的文本文件

myfile.txt
HELLO FROM THE NAMED METHOD

请参阅 开发 Gradle 任务章节 以了解更多信息。

下一步: 学习如何使用插件 >>