如何合并YAML数组?

lfe*_*445 79 yaml list data-structures

我想在YAML中合并数组,并通过ruby加载它们 -

some_stuff: &some_stuff
 - a
 - b
 - c

combined_stuff:
  <<: *some_stuff
  - d
  - e
  - f
Run Code Online (Sandbox Code Playgroud)

我想将组合数组作为 [a,b,c,d,e,f]

我收到错误:在解析块映射时没有找到预期的键

如何在YAML中合并数组?

Tam*_*lyn 22

如果您只需要将一项合并到一个列表中,您可以这样做

fruit:
  - &banana
    name: banana
    colour: yellow

food:
  - *banana
  - name: carrot
    colour: orange
Run Code Online (Sandbox Code Playgroud)

这产生

fruit:
  - name: banana
    colour: yellow

food:
  - name: banana
    colour: yellow
  - name: carrot
    colour: orange
Run Code Online (Sandbox Code Playgroud)


dre*_*mac 21

上下文

本文假设以下背景:

  • python 2.7
  • python YAML解析器

问题

lfender6445希望合并YAML文件中的两个或多个列表,并在解析时将这些合并列表显示为一个单个列表.

这可以简单地通过将YAML锚分配给映射来获得,其中期望的列表显示为映射的子元素.在下面的示例中,我们有三个映射(list_one, list_two, list_three)和三个锚点和别名,在适当的地方引用这些映射.

当YAML文件加载到程序中时,我们得到了我们想要的列表,但加载后可能需要稍加修改(参见下面的陷阱).

原始YAML文件

  list_one: &id001
   - a
   - b
   - c

  list_two: &id002
   - e
   - f
   - g

  list_three: &id003
   - h
   - i
   - j

  list_combined:
      - *id001
      - *id002
      - *id003

YAML.safe_load之后的结果

## list_combined
  [
    [
      "a",
      "b",
      "c"
    ],
    [
      "e",
      "f",
      "g"
    ],
    [
      "h",
      "i",
      "j"
    ]
  ]

陷阱

  • 这种方法产生一个嵌套的列表列表,这可能不是所需的精确输出,但可以使用flatten方法进行后处理
  • YAML锚点和别名常见警告适用于唯一性和声明顺序

结论

此方法允许使用YAML的别名和锚点功能创建合并列表.

虽然输出结果是嵌套的列表列表,但可以使用该flatten方法轻松转换.

也可以看看


Ant*_*hon 16

这不起作用:

  1. merge仅受映射的YAML规范支持,而不支持序列
  2. 您通过使用合并键<<后跟键/值分隔符:和作为引用的值完全混合,然后继续使用相同缩进级别的列表

这不正确YAML:

combine_stuff:
  x: 1
  - a
  - b
Run Code Online (Sandbox Code Playgroud)

因此,您的示例语法甚至不能作为YAML扩展提议.

如果你想做这样的事情,尝试为s1你使用YAML标记指定的某些特殊类型创建值,以便该类型的实例化对象知道如何解释元素并将所有元素替换为s2.


Jor*_*tao 15

您可以按照以下步骤实现:

# note: no dash before commands
some_stuff: &some_stuff |-
    a
    b
    c

combined_stuff:
  - *some_stuff
  - d
  - e
  - f
Run Code Online (Sandbox Code Playgroud)

我一直在使用它gitlab-ci.yml(回答有关问题的@ rink.attendant.6评论)。

  • 聪明。我现在在我们的Bitbucket管道中使用它。谢谢 (3认同)
  • @MinaLuke,比什么差?当前的答案都没有提供仅使用 yaml 合并两个项目的方法...此外,问题中没有任何内容表明 OP 希望在 CI/CD 中使用它。最后,当在 CI/CD 中使用它时,日志记录仅取决于所使用的特定 CI/CD,而不取决于 yaml 声明。因此,如果有什么不同的话,那就是您所指的 CI/CD 做得不好。这个答案中的yaml是有效的,并且解决了OP的问题。 (3认同)
  • 我对此表示怀疑。如果我错了,请纠正我,但如果它转换为“a\nb\nc”,这将意味着 gitlab-runner 将没有机会检查“a”和“b”的退出代码。因此,如果序列中除最后一个命令之外的任何命令失败,这不会中断管道,并且运行器将继续执行其余命令。 (2认同)