将Groovy 3 YamlBuilder与包含连字符的Yaml一起使用

将Groovy 3 YamlBuilder与包含连字符的Yaml一起使用,groovy,yaml,Groovy,Yaml,我正在尝试编写一个Groovy3脚本,它使用yamlbuilder编写一个yaml文件。我有它的工作,几乎一切除了 execution: set-props: url:http://myhouse.net port:8000 如何编写允许在名称中使用连字符的映射?继我以前的工作之后,我愚蠢地尝试了 def setprops=[:] setprops=(["url":"http://myhouse.net","port":"8000"]) execution.set-prop

我正在尝试编写一个Groovy3脚本,它使用yamlbuilder编写一个yaml文件。我有它的工作,几乎一切除了

execution:
  set-props:
    url:http://myhouse.net
    port:8000
如何编写允许在名称中使用连字符的映射?继我以前的工作之后,我愚蠢地尝试了

def setprops=[:]
setprops=(["url":"http://myhouse.net","port":"8000"])
execution.set-props=setprops
这给了我一个错误“赋值的LHS应该是变量或字段”

如果我只使用execution.setprops,那么它可以正常工作,但是从yaml(execution)得到的yaml当然是无效的

我认为如果设置道具是一个键/值对,那么它可以进入报价,一切都会很好。但是因为它是结构的一部分,我不知道需要做什么。

您可以使用字符串作为“方法”,生成器将创建您的 它们的中间结构:

import groovy.yaml.YamlBuilder

def b = new YamlBuilder()

b.execution {
    "set-props"(
        url: "..."
    )
}

println b
或者继续您的示例:您可以创建整个映射,并使用is作为参数,在其中您希望包含该内容

def setprops=["set-props": [url:"..."]]
b.execution(setprops)
两者都会导致:

---
执行:
设置道具:
网址:“…”

注意,第一个版本通过传递的闭包嵌套,然后在映射中传递。第二位只是传递一个嵌套映射。

Ah,因此这在代码的前面就改变了我的方法。对我来说,我定义了一个Groovy映射,其中包含相关的映射/列表,这取决于yaml需要什么。但您首先使用yamlbuilder而不是地图,然后将地图传递给它。我将从yamlbuilder开始尝试同样的方法,但是如果b是映射而不是yamlbuilder,您的解决方案将如何改变?