您对 YAML 了解多少? 📜 各版本完美整理 (从 1.0 到 1.2)

大家好!作为开发者,您一定或多或少接触过 YAML。它被广泛应用于各种场景,从 Kubernetes 配置到 GitHub Actions 工作流,再到 Ansible Playbook。🧐

但是,您知道 YAML 也有多个版本吗?特别是特定版本之间细微的差异有时会导致意想不到的错误。今天,我们将深入探讨 YAML 的诞生、发展历程以及从 1.0 到当前标准 1.2 版本之间的核心区别!


YAML 的诞生:“它不是标记语言?” 🤔

YAML 的历史可以追溯到 2001 年。Clark Evans 首次提出,并与 Ingy döt Net、Oren Ben-Kiki 一起开始了开发。

  • 最初的名称:最初名为 Yet Another Markup Language(“另一种标记语言”)。当时,它旨在作为复杂 XML 的替代品,成为一种更易于人类读写的标记语言。
  • 名称的演变💡:然而,在开发过程中,YAML 的哲学变得清晰,它更侧重于表示数据的“数据序列化”,而非表示文档结构的“标记”。因此,它将名称更改为递归缩写 YAML Ain’t Markup Language(“YAML 不是标记语言”)。这个名称本身就揭示了 YAML 的核心身份(以数据为中心!)。
  • 灵感来源 📚:YAML 从 C、Python、Perl 等编程语言以及电子邮件格式(RFC 822)中汲取了大量灵感。特别是像 Python 一样,通过缩进来表示数据层次结构的方式是 YAML 最重要的特征之一。

深入探讨各版本核心特性 🚀

现在,让我们来看看每个版本有哪些特点以及它们是如何演进的。

YAML 1.0 (2004年) – 👶 一切的开始

  • 这是第一个官方规范。
  • 它定义了构成 YAML 基础的基本数据结构。
  • 标量(Scalars):字符串、数字、布尔值等单一值
  • 序列(Sequences):列表或数组 (例如:- item1)
  • 映射(Mappings):哈希或字典 (例如:key: value)
  • 它通过缩进表达数据层次结构,确立了核心语法,塑造了 YAML 的身份。

YAML 1.1 (2005年) – 🏃‍♂️ 广泛采用,但存在一些混乱

  • 这是使用时间最长、最广泛的版本。许多旧的库和工具都是基于此版本构建的。
  • 它明确了对 UTF-8、UTF-16 等字符编码的支持。
  • 它通过支持各种转义序列(n、t 等)扩展了字符串表示能力。

⚠️ 然而,YAML 1.1 有一个重要的“陷阱”。那就是它对某些字符串作为布尔值(true/false)的解释过于宽泛。

例如,yes、no、on、off 等词语都被自动转换为布尔值。

YAML 1.2 (2009年) – 👑 当前标准,混乱的终结者

这是我们目前使用的大多数最新工具所遵循的事实标准(de facto standard)版本。它解决了 YAML 1.1 的问题,并发展得更加可预测和稳定。

最大的变化:与 JSON 的完美兼容性 🤝

YAML 1.2 最重要的特点是将 JSON 作为官方子集(subset)。这意味着什么呢?

“任何有效的 JSON 文档本身也是一个有效的 YAML 1.2 文档。”

因此,使用 YAML 解析器直接读取 JSON 数据,或者在两种格式之间进行转换变得非常容易。

// 我是一个有效的 JSON 文件。
{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "courses": ["History", "Math"]
}

上述 JSON 数据无需额外转换,本身就是一个完全有效的 YAML 1.2 数据。非常方便,不是吗!

语法整理和歧义解决:最重要的区别! ✨

YAML 1.2 解决了 1.1 版本最大的问题,即“对布尔值的过度宽泛解释”。

🤔 稍等,这为什么是个问题呢? 想象一下存储国家代码。挪威的国家代码是 NO。如果使用 YAML 1.1 解析器,这个 NO 可能会被解释为布尔值 false 而不是字符串,从而导致一个可怕的错误。

👇 让我们通过代码直接比较一下。

# data.yaml
country_code: NO
all_inclusive: YES
power: on

如果用不同版本的解析器读取这个文件会怎样呢?

  • YAML 1.1 解析器的解释结果 (Raw Data) 👎正如您所看到的,它将所有值都转换成了布尔值,这与我们的意图完全不同。这可能导致严重的数据不一致。
  • { “country_code”: false, “all_inclusive”: true, “power”: true }
  • YAML 1.2 解析器的解释结果 (Raw Data) 👍YAML 1.2 只将 true 和 false 识别为显式布尔值,其余所有都安全地作为字符串处理。它更加可预测和安全!这就是我们应该使用 YAML 1.2 的核心原因。
  • { “country_code”: “NO”, “all_inclusive”: “YES”, “power”: “on” }

YAML 1.2.1 & 1.2.2 (2021年) – ✍️ 修正错别字和澄清

在 1.2 版本发布大约 12 年后,修订版问世,但完全没有添加新功能。这些是维护版本,重点在于改进文档本身,例如修正现有 1.2 规范中的错别字,或澄清模糊的解释。因此,我们仍然应该以 YAML 1.2 为标准。


一览总结 📊

版本 发布日期 主要特点
1.0 2004年1月 👶 首个官方规范,定义了基本结构
1.1 2005年1月 🏃‍♂️ 明确了编码,但布尔值解释存在歧义
1.2 2009年7月 👑 当前标准,与 JSON 完美兼容,解决歧义,提高稳定性
1.2.2 2021年10月 ✨ 未更改功能,仅改进了规范文档的清晰度

###

结论:我们生活在 YAML 1.2 的时代! ✅

总而言之,如果您目前正在使用 YAML,强烈建议以 YAML 1.2 版本为基础进行理解和编写。幸运的是,我们使用的大多数现代工具,如 Kubernetes、Ansible、GitHub Actions 和 Docker Compose,都忠实地遵循 YAML 1.2 规范。

现在,当您在 YAML 文件中看到 yes、on 等值而不是 true/false 时,您会想到:“啊,那是 YAML 1.1 风格的遗留物!” 了解我们所用工具的历史,将极大地帮助我们避免意外错误,并构建更健壮的系统。😊


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注