Gradle NamedDomainObject 从未配置过

标签 gradle kotlin plugins

我有一个简单的 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
    }
}

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

最佳答案

终于发现是我误会了容器的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/

相关文章:

gradle - 当排除所有传递依赖项时,Gradle会排除self

android - Gradle 复制替换文本并放入同一个文件夹

plugins - froala 无序列表未显示在编辑器中

plugins - Facebook 评论插件消失了

gradle - Gradle War插件不包括自定义插件的输出

android - 等待 RxJava 响应

android - 如何根据 Kotlin 中的键值从 firebase 读取数据

android - 我们应该在 Kotlin 中绑定(bind) android View 吗?

linux - 通过project.vim 将文件添加到项目中

android - 添加google-api-client时,Gradle构建失败并重复