Appearance
插件扩展(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
}
}
}下一步
- 插件发布 - 发布插件到 Plugin Portal