【问题标题】:Gradle NamedDomainObject is never configuredGradle NamedDomainObject 从未配置过
【发布时间】:2019-09-10 14:00:45
【问题描述】:

我有一个简单的 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 属性。

public class PublishSpec {

    var name: String
    var artifact: String = ""
    var taskName: String = ""
    var type: String = "default"

    constructor(name: String) {
        this.name = name
    }
}

但是,以下只是将allcore 评估为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

【问题讨论】:

标签: gradle kotlin plugins


【解决方案1】:

我终于发现我误会了容器的all api的用法。事实证明,all 旨在在添加元素时执行代码,但这并不意味着该对象已配置。因此,我在 all 闭包中看到了预期的行为,因为委托 PublishSpec 实例仅使用 default初始化

为了获得我的预期行为,您必须在afterEvaluate 中迭代容器,而不是依赖all

project.afterEvaluate {
    publishContainer.forEach {
        addPublicationRepository(this, myProject)
        addPublication(this, myProject)
    }
}

请注意,在我引用的博文中,all 的使用环境与我最初尝试的不同。评估项目后执行任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2011-08-24
    相关资源
    最近更新 更多