从未配置Gradle NamedDomainObject
我有一个简单的kotlin gradle插件,它创建了一个从未配置Gradle NamedDomainObject,gradle,kotlin,plugins,Gradle,Kotlin,Plugins,我有一个简单的kotlin gradle插件,它创建了一个容器,并对其中的每个元素执行一些操作,例如container.all{doSomething()}。但是,似乎从未正确配置过NamedDomainObjectCollection。调用all时,每个元素都有初始默认值 创建容器并添加它 // create publish container val publishContainer: NamedDomainObjectCollection<PublishSpec> = proj
容器
,并对其中的每个元素执行一些操作,例如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)
}
但是,以下内容只是将all
与core
作为默认类型进行计算
plugins {
id "my-publish"
}
myPublish {
"core" {
artifact = "foo.zip"
type = "archive"
taskName = "fooTask"
}
}
这不管用了吗
我终于发现我误解了容器的all
api的用法。事实证明,all
旨在在添加元素时执行代码,但这并不意味着对象已配置。因此,我在all
闭包中看到了预期的行为,因为委托PublishSpec
实例仅使用默认值初始化
为了获得我想要的行为,您必须在afterEvaluate
中迭代容器,而不是依赖all
project.afterEvaluate {
publishContainer.forEach {
addPublicationRepository(this, myProject)
addPublication(this, myProject)
}
}
请注意,在我引用的博客文章中,all
的使用环境与我最初尝试的不同。任务的执行在项目评估之后进行。我建议遵循Gradle的官方指南,这些指南更为最新。和
project.afterEvaluate {
publishContainer.forEach {
addPublicationRepository(this, myProject)
addPublication(this, myProject)
}
}