【问题标题】:Overlay and override two yaml documents with yq用 yq 覆盖和覆盖两个 yaml 文档
【发布时间】:2021-11-29 19:50:49
【问题描述】:

我想将一个 yaml 文档覆盖在另一个文档之上,将任何数组更新为覆盖的值。

给定基础/源文件:

#base.yaml
include:
  - directory: foo/foo1
  - directory: bar/bar1

和覆盖文件:

#overlay.yaml
include:
  - directory: foo/foo1
    extra: true
    stuff:
      stuff1: true
      stuff2: true
  - directory: something/else

结果应该是这样的

#results.yaml
include:
  - directory: foo/foo1
    extra: true
    stuff:
      stuff1: true
      stuff2: true
  - directory: bar/bar1
  - directory: something/else

我想我已经接近让它与来自this postyq 一起使用,但列表元素没有被覆盖。相反,我得到了 foo/foo1 的重复项

yq eval-all '. as $item ireduce ({}; . *+ $item)' base.yaml overlay.yaml 产生

#base.yaml
#overlay.yaml
include:
  - directory: foo/foo1
  - directory: bar/bar1
  - directory: foo/foo1
    extra: true
    stuff:
      stuff1: true
      stuff2: true
  - directory: something/else

* 之后删除+ 将从输出中删除bar/bar1

基本上我认为我是在include 上操作,而不是include 键的值。我将不胜感激任何帮助使覆盖工作。

【问题讨论】:

    标签: yaml yq


    【解决方案1】:

    在此处查看此示例:https://mikefarah.gitbook.io/yq/operators/multiply-merge#merge-arrays-of-objects-together-matching-on-a-key

    基本上你需要:

    yq eval-all '
    (
      ((.include[] | {.directory: .}) as $item ireduce ({}; . * $item )) as $uniqueMap
      | ( $uniqueMap  | to_entries | .[]) as $item ireduce([]; . + $item.value)
    ) as $mergedArray
    | select(fi == 0) | .include= $mergedArray
    ' sample.yml another.yml
    

    披露:我写了 yq

    【讨论】:

    • 这正是我所需要的。感谢您的帮助,以及指向文档的指针。
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 2011-06-19
    • 2014-05-31
    • 2018-10-07
    • 2022-01-12
    • 2012-05-08
    • 2017-05-02
    相关资源
    最近更新 更多