假设我有一个名为 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 将它们视为“嵌套扩展”?...如果这确实是一件事的话。
这里的最佳实践是什么?
当您在 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
}
}