Skip to content

任务规则

任务规则(Task Rules)允许定义动态任务的创建规则,当用户请求匹配规则的任务时,Gradle 动态创建并执行该任务。

基本用法

kotlin
// build.gradle.kts
tasks.addRule("Pattern: ping<ServiceName>") { taskName ->
    if (taskName.startsWith("ping")) {
        val serviceName = taskName.removePrefix("ping")
        tasks.register(taskName) {
            group = "ping"
            description = "Ping $serviceName 服务"
            doLast {
                println("Pinging $serviceName...")
                // 实际的 ping 逻辑
            }
        }
    }
}
bash
# 可以执行任何 ping 开头的任务
./gradlew pingAuthService
./gradlew pingOrderService
./gradlew pingDatabase

# 查看规则说明
./gradlew tasks
# ping tasks
# ----------
# Pattern: ping<ServiceName>

实用示例:环境部署

kotlin
tasks.addRule("Pattern: deployTo<Environment>") { taskName ->
    if (taskName.startsWith("deployTo")) {
        val env = taskName.removePrefix("deployTo").lowercase()
        val validEnvs = setOf("dev", "test", "staging", "prod")
        
        if (env in validEnvs) {
            tasks.register(taskName) {
                group = "deployment"
                description = "部署到 $env 环境"
                doLast {
                    println("正在部署到 $env 环境...")
                    // 部署逻辑
                }
            }
        }
    }
}
bash
./gradlew deployToDev
./gradlew deployToProd

与 dependsOn 结合

kotlin
tasks.addRule("Pattern: migrate<Version>") { taskName ->
    val match = Regex("migrate(\\d+)").find(taskName)
    if (match != null) {
        val version = match.groupValues[1]
        tasks.register(taskName) {
            doLast {
                println("执行版本 $version 的数据库迁移")
            }
        }
    }
}

tasks.register("migrateAll") {
    dependsOn("migrate001", "migrate002", "migrate003")
}

下一步