从未配置Gradle NamedDomainObject

从未配置Gradle NamedDomainObject,gradle,kotlin,plugins,Gradle,Kotlin,Plugins,我有一个简单的kotlin gradle插件,它创建了一个容器,并对其中的每个元素执行一些操作,例如container.all{doSomething()}。但是,似乎从未正确配置过NamedDomainObjectCollection。调用all时,每个元素都有初始默认值 创建容器并添加它 // create publish container val publishContainer: NamedDomainObjectCollection<PublishSpec> = proj

我有一个简单的kotlin gradle插件,它创建了一个
容器
,并对其中的每个元素执行一些操作,例如
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)
    }
}