如何在 Kotlin 中设计复杂/嵌套的 Gradle 扩展?

问题描述 投票:0回答:1

假设我有一个名为 FooPlugin 的 gradle 插件。然后我这样定义它:

abstract class FooPlugin: Plugin<Project> {
    override fun apply(project: Project) {
        val extension = target.extensions.create("foo", FooPluginExtension::class.java)
            .apply {
                // apply conventions
            }

        // register tasks
    }
}

但是我的扩展接口有像这样的嵌套类:

interface FooExtension {
    val complexProperty: Property<Bar>
    val otherComplexProperty: Property<Baz>
}

我希望生成的 gradle 代码如下所示:

// build.gradle.kts
foo {
    bar {
        myInt = 1
    }
    baz {
        myBool = true
    }
}

我应该自己为

Bar
Baz
实现一个构建器并将它们定义为类吗?或者我应该将它们定义为接口,如下所示:

interface Bar {
    val myInt: Property<Int>
}

并找出一种方法让 Gradle 将它们视为“嵌套扩展”?...如果这确实是一件事的话。

这里的最佳实践是什么?

kotlin gradle gradle-plugin gradle-kotlin-dsl
1个回答
0
投票

当您在 Gradle 中创建扩展时,该扩展本身就变得可扩展,就像默认情况下的

Project
对象一样。

用代码术语来说,这意味着扩展对象将扩展

ExtensionAware
接口。

然后你可以写,例如:

// In plugin

abstract class FooExtension
abstract class BarExtension {
    var myInt: Int = 0
}
abstract class BazExtension {
    var myBool: Boolean = false
}

val foo = extensions.create("foo", FooExtension::class.java)
with(foo as ExtensionAware) {
    val bar = extensions.create("bar", BarExtension::class.java)
    val baz = extensions.create("baz", BazExtension::class.java)
}

然后按照您的示例进行配置:

// build.gradle.kts

foo {
    bar {
        myInt = 1
    }
    baz {
        myBool = true
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.