假设我有一个这样的扩展接口:
interface MyExtension {
abstract val container: ExtensiblePolymorphicDomainObjectContainer<MyBaseClass>
}
当我尝试通过以下方式创建此扩展的示例时:
class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
val extension = project.extensions.create<MyExtension>("myExtension")
}
}
Gradle(至少在7.6.1版本)似乎会因为无法创建扩展而无法应用MyPlugin
,这反过来又是因为能够正确实现container
属性。
这是Gradle的限制还是KotlinDSL需要解决方案(例如:使MyExtension
成为一个抽象类,并专门注入一个ObjectFactory
),还是我做错了什么?
1条答案
按热度按时间mwkjh3gx1#
Gradle只能在托管类型上创建特定类型的属性
这些是
Property<T>
RegularFileProperty
DirectoryProperty
ListProperty<T>
SetProperty<T>
MapProperty<K, V>
ConfigurableFileCollection
ConfigurableFileTree
DomainObjectSet<T>
NamedDomainObjectContainer<T>
在Gradle v8.2中,将支持
ExtensiblePolymorphicDomainObjectContainer<T>
。在此之前,必须使用ObjectFactory
手动创建它们。一种方法是将ObjectFactory注入构造函数:
专业提示:适用于
NamedDomainObjectContainer
的Kotlin DSL访问器请注意,即使Gradle会自动创建
NamedDomainObjectContainer
属性,但手动创建并将其添加为扩展通常是一个好主意。这是冗长和怪异的-所以为什么麻烦?
通过添加
namedContainer
作为扩展,Gradle将为添加的任何元素自动生成一些类型安全的Kotlin DSL访问器。因此,如果在您的插件中添加一个元素。
在任何构建脚本中,都有一种简单的方法来以类型安全和IDE友好的方式访问元素