Skip to content

插件扩展(Extension)

Extension 是插件向用户暴露配置 API 的标准方式,让用户在 build.gradle.kts 中配置插件行为。

基本 Extension

kotlin
// Extension 定义
abstract class DeployExtension {
    abstract val host: Property<String>
    abstract val port: Property<Int>
    abstract val username: Property<String>
    abstract val dryRun: Property<Boolean>
    
    init {
        // 设置默认值
        port.convention(22)
        dryRun.convention(false)
    }
}

// 插件中注册 Extension
class DeployPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        val deploy = project.extensions.create("deploy", DeployExtension::class.java)
        
        project.tasks.register("deploy") {
            doLast {
                println("部署到 ${deploy.host.get()}:${deploy.port.get()}")
                if (deploy.dryRun.get()) println("[Dry Run] 不实际执行")
            }
        }
    }
}
kotlin
// 用户配置
deploy {
    host = "prod.example.com"
    username = "deploy"
    dryRun = false
}

嵌套 Extension

kotlin
abstract class ServerExtension {
    abstract val host: Property<String>
    abstract val port: Property<Int>
}

abstract class DatabaseExtension {
    abstract val url: Property<String>
    abstract val poolSize: Property<Int>
}

abstract class AppExtension {
    // 嵌套 Extension 使用 @Nested
    abstract val server: ServerExtension
    abstract val database: DatabaseExtension
    
    // 添加嵌套 Extension 的配置方法
    fun server(action: Action<ServerExtension>) = action.execute(server)
    fun database(action: Action<DatabaseExtension>) = action.execute(database)
}
kotlin
// 用户配置
app {
    server {
        host = "localhost"
        port = 8080
    }
    database {
        url = "jdbc:mysql://localhost/mydb"
        poolSize = 10
    }
}

NamedDomainObjectContainer(命名容器)

kotlin
abstract class EnvironmentConfig(val name: String) {
    abstract val url: Property<String>
    abstract val debug: Property<Boolean>
}

abstract class MultiEnvExtension {
    abstract val environments: NamedDomainObjectContainer<EnvironmentConfig>
    
    fun environments(action: Action<NamedDomainObjectContainer<EnvironmentConfig>>) {
        action.execute(environments)
    }
}
kotlin
// 用户配置
multiEnv {
    environments {
        create("dev") {
            url = "https://dev.example.com"
            debug = true
        }
        create("prod") {
            url = "https://example.com"
            debug = false
        }
    }
}

下一步