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)

任務群組和描述

在您的任務上設定群組描述屬性可以幫助使用者理解如何使用您的任務

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 任務章節以了解更多資訊。

下一步: 學習如何使用外掛 >>