如何自动重新缩进 YAML 文件?

now*_*wox 7 yaml

让我们考虑这个例子:

---
foo:
  alice: female
  bob:   male
bar:
  - node: 42
    name: none
  - node: 43
    name: none
Run Code Online (Sandbox Code Playgroud)

如果我决定重新压缩所有内容并从这里开始:

---
foo:
alice: female
bob:   male
bar:
- node: 42
name: none
- node: 43
name: none
Run Code Online (Sandbox Code Playgroud)

我没有足够的信息来做这件事。实际上vim的尝试是这样的:

---
foo:
    alice: female
bob:   male
bar:
    - node: 42
name: none
- node: 43
name: none
Run Code Online (Sandbox Code Playgroud)

Ansible 也无法做到:

---
foo:

alice: female
bob:   male
bar:

- node: 42
  name: none
  - node: 43
    name: none
Run Code Online (Sandbox Code Playgroud)

我认为一种可能的解决方法是在增加缩进时添加一个空行:

---
foo:

  alice: female
  bob:   male
bar:

  - node: 42
    name: none
  - node: 43
    name: none
Run Code Online (Sandbox Code Playgroud)

在我看来,YAML 的主要问题是人们仍在与制表符、空格和缩进大小作斗争。对于多人编辑的大型 YAML 文件,无法再正确解析生成的文件。我看到的两个解决方案是:

  1. 仅使用制表符和强制制表符标识,因为 Makefile 就是这种情况
  2. 以上解决方案

Ant*_*hon 5

您似乎想要做的是确保您的 YAML 文件统一缩进(例如,在被检入修订控制系统之前)。如果您将结构弄平,那么您将缩进然后重新缩进的想法将不起作用,因为您会丢失信息。这个:

foo:
  alice: female
  bob:   male
Run Code Online (Sandbox Code Playgroud)

由两个映射组成:一个具有一个键的映射和一个将两个键映射到两个值的值。

这个:

foo:
alice: female
bob:   male
Run Code Online (Sandbox Code Playgroud)

是一对一映射有三个键,并且键foo具有值作为空标量(也可写的,除了空字符串,如~NULLnull在YAML文件)。

大多数 YAML 解析器在将文件读入内部数据时会丢失信息:

  • 评论被删除
  • 不为映射保留键顺序
  • 标量周围的额外空格不被保留

ruamel.yaml Python包(其中我的作者)是enhancemed解析器来允许往返YAML文件的数据和回YAML保留更多的原始信息。它将保留注释和键顺序,但它会减少例如单行标量周围的额外间距。

这种往返通常在第二次往返时稳定下来,因此这可用于重新缩进 YAML 文件。yaml包中包含的实用程序ruamel.yaml.cmd,无需自己编程即可用于此目的:

yaml round-trip your_file.yml --verbose
Run Code Online (Sandbox Code Playgroud)

(round-trip可以缩短为rt) 将检查文件是否以及如何更改。如果确实发生了变化,它会显示一个统一的差异。基于此,您可以决定在文件稳定时保存文件:

yaml round-trip your_file.yml --save
Run Code Online (Sandbox Code Playgroud)

的输出example.yml

---
foo:
  alice: female  # verified
  bob:   male
bar:
- node:   42
  name: none
-     node: 43
      name: none
Run Code Online (Sandbox Code Playgroud)

将是:

example.yml:
     stabilzes on second round trip, ok without comments
--- example.yml
+++ round trip YAML
@@ -1,9 +1,9 @@
 ---
 foo:
   alice: female  # verified
-  bob:   male
+  bob: male
 bar:
-- node:   42
+- node: 42
   name: none
--     node: 43
-      name: none
+- node: 43
+  name: none
Run Code Online (Sandbox Code Playgroud)

保存后看起来像:

---
foo:
  alice: female  # verified
  bob: male
bar:
- node: 42
  name: none
- node: 43
  name: none
Run Code Online (Sandbox Code Playgroud)

缩进级别默认为 2,但可以通过选项设置为yaml

  • yaml 实用程序位于 `ruamel.yaml.cmd` 包中,`ruamel.yaml` 只有库。 (2认同)