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")
    }
}

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.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.kts
abstract class CreateFileTask : DefaultTask() {
    @Input
    val fileText = "HELLO FROM MY TASK"

    @Input
    val fileName = "myfile.txt"

    @OutputFile
    val myFile: File = File(fileName)

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

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

設定工作

在建置指令碼中使用TaskCollection.named()方法,可以選擇設定工作。

CreateFileTask類別已更新,讓檔案中的文字可以設定

build.gradle.kts
abstract class CreateFileTask : 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<CreateFileTask>("createFileTask") {
    group = "custom"
    description = "Create myfile.txt in the current directory"
    fileText.convention("HELLO FROM THE CREATE FILE TASK METHOD") // Set convention
}

tasks.named<CreateFileTask>("createFileTask") {
    fileText.set("HELLO FROM THE NAMED METHOD") // Override with custom message
}

named()方法中,我們找到createFileTask工作,並設定要寫入檔案的文字。

執行工作時

$ ./gradlew createFileTask

> Configure project :app

> Task :app:createFileTask

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

專案根資料夾中會建立一個名為myfile.txt的文字檔

myfile.txt
HELLO FROM THE NAMED METHOD

請參閱開發 Gradle 工作章節,以深入了解。