如何从yaml配置中删除继承属性?

Bru*_*oLM 5 dictionary yaml docker docker-compose

我有一个像这样的yaml文件:

local: &local
  image: xxx
  # *tons of config*

ci:
  <<: *local
  image: # delete
  build: .
Run Code Online (Sandbox Code Playgroud)

我想ci继承所有的值local,除了image.

有没有办法"删除"这个值?

Ant*_*hon 7

没有办法key在YAML文件中标记删除.您只能覆盖现有值.

后者就是你所做的,你将空标量作为值与关键字相关联,image就像你写的那样:

  image: null   # delete
Run Code Online (Sandbox Code Playgroud)

您可以执行以下两项操作:在YAML文件中进行后处理或制作基本映射.

如果要进行后处理,则将特殊唯一值与image特殊标记对象关联,并在加载后递归遍历树以删除具有此特殊值的键值对.您是否可以在解析期间使用挂钩或覆盖其某些方法来执行此操作,这取决于解析器.

使用基本映射需要较少的工作,但对YAML文件更具侵入性:

localbase: &lb
  # *tons of config*

local: &local
  image: xxx

ci:
  <<: *lb
  build: .
Run Code Online (Sandbox Code Playgroud)

如果你做前者,你应该注意,如果你使用一个解析器来保持往返的"合并层次结构"(就像我的ruamel.yaml解析器可以做的那样),删除键值对是不够的,在这种情况下是原始的从local会回来.其他只在加载时解决此问题的解析器没有此问题.


msl*_*sln 5

对于接受值列表的属性,您可以[]作为值发送。

例如在 docker-compose 中你不想继承ports

service_1:  &service_1
    # some other properties.
    ports:
      - "49281:22"
      - "8876:8000"
    # some other properties

    image: some_image:latest

service_2:
    <<: *service_1
    ports: []  # it removes ports values.
    image: null  # it removes image value.

Run Code Online (Sandbox Code Playgroud)