如何为Kotlin实现的Gradle插件添加嵌套配置?
实现Gradle插件的嵌套配置(Kotlin版)
1. 定义嵌套的Nexus配置类
先把nexus相关配置抽离到单独的抽象类中,替代原来分散的四个属性:
import org.gradle.api.provider.Property abstract class NexusExtension { abstract val server: Property<String> abstract val user: Property<String> abstract val pass: Property<String> abstract val repository: Property<String> }
2. 修改主插件扩展类
将原扩展类中的nexus属性替换为嵌套的NexusExtension,并添加@Nested注解让Gradle识别这是嵌套配置:
import org.gradle.api.Nested import org.gradle.api.provider.Property abstract class MyPluginExtension { // 保留原有非nexus相关属性(如果有) @get:Nested abstract val nexus: NexusExtension }
3. 调整插件类的扩展初始化与任务绑定
创建主扩展时,Gradle会自动初始化嵌套的NexusExtension,无需手动创建。修改任务的属性绑定逻辑,直接从嵌套扩展中读取值:
import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.register class MyPlugin : Plugin<Project> { override fun apply(target: Project) { val extension = target.extensions.create("myName", MyPluginExtension::class.java) target.tasks.register<MyTask>("taskName") { group = "myGroup" description = "Do something" nexusServer.set(extension.nexus.server) nexusUser.set(extension.nexus.user) nexusPass.set(extension.nexus.pass) nexusRepository.set(extension.nexus.repository) } } }
4. 验证嵌套配置用法
现在在使用插件的项目中,即可采用期望的嵌套配置形式:
myName { nexus { server.set("https://some-url") user.set("some-user") pass.set("some-password-taken-from-env-variable-provider") repository.set("some repository") } }
关键注意事项
- 嵌套配置类必须是抽象类,使用Gradle提供的
Property等延迟求值类型,保证配置的懒加载和可增量性 - 主扩展类中的嵌套属性必须添加
@Nested注解,Gradle会自动处理嵌套扩展的实例化和配置闭包解析
内容的提问来源于stack exchange,提问作者Victor Smirnov
相关产品推荐
相关产品推荐

