blob: fde837c12a838a51f96f1556445ce67837a65191 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="nsfisis">
<meta name="copyright" content="© 2025 nsfisis">
<meta name="description" content="データ記述言語 YAML におけるバージョン 1.1 と 1.2 の主な破壊的変更をまとめた。">
<meta name="keywords" content="YAML">
<meta property="og:type" content="article">
<meta property="og:title" content="【YAML】YAML 1.1 と YAML 1.2 の主な破壊的変更|REPL: Rest-Eat-Program Loop">
<meta property="og:description" content="データ記述言語 YAML におけるバージョン 1.1 と 1.2 の主な破壊的変更をまとめた。">
<meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
<meta property="og:locale" content="ja_JP">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>【YAML】YAML 1.1 と YAML 1.2 の主な破壊的変更|REPL: Rest-Eat-Program Loop</title>
<link rel="stylesheet" href="/style.css?h=306fbb7e06e01b63f08d46374ffa6cf1">
</head>
<body class="single">
<header class="header">
<div class="site-logo">
<a href="/">REPL: Rest-Eat-Program Loop</a>
</div>
<nav class="nav">
<ul>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/posts/">Posts</a>
</li>
<li>
<a href="/slides/">Slides</a>
</li>
<li>
<a href="/tags/">Tags</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="post-single">
<header class="post-header">
<h1 class="post-title">【YAML】YAML 1.1 と YAML 1.2 の主な破壊的変更</h1>
<ul class="post-tags">
<li class="tag">
<a href="/tags/yaml/">YAML</a>
</li>
</ul>
</header>
<div class="post-content">
<section id="changelog">
<h2><a href="#changelog">更新履歴</a></h2>
<ol>
<li class="revision">
<time datetime="2021-06-30">2021-06-30</time>: デジタルサーカス株式会社の社内記事として公開
</li>
<li class="revision">
<time datetime="2025-01-26">2025-01-26</time>: ブログ記事として一般公開
</li>
</ol>
</section>
<div class="admonition">
<div class="admonition-label">
NOTE
</div>
<div class="admonition-content">
<p>
この記事は、2021-06-30 に <a href="https://www.dgcircus.com/" rel="noreferrer" target="_blank">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
</p>
</div>
</div>
<section id="section--intro">
<h2><a href="#section--intro">はじめに</a></h2>
<p>
データ記述言語の一つ YAML には 1.0、1.1、1.2 のバージョンがある。 これらのうち、1.1 と 1.2 の間には無視できない非互換の変更が多く、1.2 に対応していないライブラリもある (Ruby 同梱の <code>yaml</code> など)。 この記事では、YAML 1.1 と YAML 1.2 の主な破壊的変更を紹介する (影響範囲が広いものを抜粋しており、すべての非互換を網羅してはいない)。
</p>
<p>
参照した仕様書はこちら: <a href="https://yaml.org/spec/1.2.2/ext/changes/" rel="noreferrer" target="_blank">https://yaml.org/spec/1.2.2/ext/changes/</a>
</p>
</section>
<section id="section--breaking-changes">
<h2><a href="#section--breaking-changes">主な破壊的変更</a></h2>
<section id="section--breaking-changes--boolean-literals">
<h3><a href="#section--breaking-changes--boolean-literals">Boolean としてパースされるトークンが <code>true</code> / <code>false</code> とその亜種のみに</a></h3>
<p>
この変更の影響が最も大きいと思われる。 YAML 1.1 では、boolean 値のリテラルとして <code>true</code>、<code>false</code> のほか <code>yes</code>、<code>no</code>、<code>y</code>、<code>n</code>、<code>on</code>、<code>off</code>、それらの大文字バージョンなどが認められていた。 YAML 1.2 では、<code>true</code> と <code>false</code>、それらの大文字バージョン (<code>True</code>、<code>TRUE</code>、<code>False</code>、<code>FALSE</code>) のみが boolean としてパースされるようになった。
</p>
</section>
<section id="section--breaking-changes--octal-literals">
<h3><a href="#section--breaking-changes--octal-literals">八進数リテラルには <code>0o</code> が必須に</a></h3>
<p>
C 言語などでは、<code>0</code> から始まる数字の列を八進数としてパースする。 YAML 1.1 もこれに準じていたが、1.2 からは <code>0o</code> のプレフィクスが必須となった (“o” は “octal” の “o”)。 プログラミング言語では、Python や Haskell、Swift、Rust などがこの記法を採用している。
</p>
</section>
<section id="section--breaking-changes--merging">
<h3><a href="#section--breaking-changes--merging"><code><<</code> によるマージが不可能に</a></h3>
<p>
YAML 1.1 では、<code><<</code> という文字列をキーに指定することで、マップをマージすることができた。
</p>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#22863A">x</span><span style="color:#24292E">: </span><span style="color:#D73A49">&</span><span style="color:#6F42C1">base</span></span>
<span class="line"><span style="color:#22863A"> a</span><span style="color:#24292E">: </span><span style="color:#005CC5">123</span></span>
<span class="line"><span style="color:#6A737D"># => { "x": { "a": 123 } }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#005CC5">y</span><span style="color:#24292E">:</span></span>
<span class="line"><span style="color:#005CC5"> <<</span><span style="color:#24292E">: </span><span style="color:#D73A49">*</span><span style="color:#24292E">base</span></span>
<span class="line"><span style="color:#22863A"> b</span><span style="color:#24292E">: </span><span style="color:#005CC5">456</span></span>
<span class="line"><span style="color:#6A737D"># => { "y": { "a": 123, "b": 456 } }</span></span></code></pre>
</div>
<p>
1.2 からはこれができなくなる。
</p>
</section>
<section id="section--breaking-changes--number-separator">
<h3><a href="#section--breaking-changes--number-separator">数字を <code>_</code> で区切るのが禁止に</a></h3>
<p>
<code>1234567</code> を <code>1_234_567</code> と書けなくなった。
</p>
</section>
</section>
<section id="section--outro">
<h2><a href="#section--outro">おわりに</a></h2>
<p>
全体的に、<em>There’s more than one way to do it.</em> から <em>There should be one - and preferably only one - obvious way to do it.</em> へ移行しているように思われる。 データ記述言語としては望ましい方向性ではないかと感じる。
</p>
</section>
</div>
</article>
</main>
<footer class="footer">
© 2021 nsfisis
</footer>
</body>
</html>
|