我有一个简单的 kotlin gradle 插件,可以创建 container
并对其中的每个元素执行一些操作,例如container.all { doSomething() }
.但是,似乎 NamedDomainObjectCollection
曾经正确配置过。当all
被调用时,每个元素都有初始默认值。
创建容器并添加它。
// create publish container
val publishContainer: NamedDomainObjectCollection<PublishSpec> = project.container(PublishSpec::class.java)
project.extensions.add(CONTAINER_NAME, publishContainer)
// for every element in the publishing container
publishContainer.all {
addPublicationRepository(this, myProject)
addPublication(this, myProject)
}
PublishSpec
是一个相当简单的类,具有 4 个可变属性,包括必需的 name
属性(property)。public class PublishSpec {
var name: String
var artifact: String = ""
var taskName: String = ""
var type: String = "default"
constructor(name: String) {
this.name = name
}
}
但是,以下只是评估
all
与 core
作为 default
类型。plugins {
id "my-publish"
}
myPublish {
"core" {
artifact = "foo.zip"
type = "archive"
taskName = "fooTask"
}
}
这不再起作用了吗?
https://mrhaki.blogspot.com/2016/02/gradle-goodness-create-objects-with-dsl.html
最佳答案
终于发现是我误会了容器的all
的用法api。原来all
旨在在添加元素时执行代码,但这并不意味着该对象已被配置。所以,我在 all
中看到了预期的行为。关闭,作为代表PublishSpec
instance 仅使用默认值初始化。
为了获得我的预期行为,您必须在 afterEvaluate
中迭代容器而不是依赖all
project.afterEvaluate {
publishContainer.forEach {
addPublicationRepository(this, myProject)
addPublication(this, myProject)
}
}
请注意,在我引用的博客文章中,
all
用于与我最初尝试的不同的上下文中。评估项目后执行任务。
关于Gradle NamedDomainObject 从未配置过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57872469/