YAML 的挪威问题与 cron 的日期陷阱:两种会骗你的配置格式
来源:dev.to — 2026-10-09
📋 概述
把四行无害的 YAML 交给 PyYAML,挪威的国家代码 NO 会变成布尔 False、版本 1.10 会变成浮点 1.1、文件权限 0755 会变成十进制 493,而每个 GitHub Actions 工作流都需要的 on: 键会成为 True。原因是 YAML 1.1 与 1.2 对未加引号标量的规则不同,你得到哪套规则取决于解析器而不是文件本身。cron 有个近亲:想表达「每月第一个周一」写下 0 9 1-7 * MON,日与星期字段之间是「或」而不是「与」,结果是每月 1 至 7 号每天都跑。作者提供了两个免费的浏览器模拟器,把这两套规则可视化。
🔑 核心要点
- PyYAML 下 country: NO 会变成 False,version: 1.10 变成浮点 1.1,mode: 0755 变成 493。
- 差异来自 YAML 1.1 与 1.2 对未加引号标量的不同规则,取决于解析器而非文件。
- 修复方式就是加引号:code: "NO"、version: "1.10"、mode: "0755" 在两种规范下都是字符串。
- cron 的 0 9 1-7 * MON 并不表示每月第一个周一,而是每月 1 至 7 号每天都运行。
- 重复键在 PyYAML 里静默取最后一个值,在 js-yaml 里则直接拒绝文档。
💡 金句
两种格式都没有坏,它们只是遵循了写下来的规则——而那不是你假设的规则。
👍 0
👎 0
← 返回 dev.to 首页