YAMLの編集内容を比較する場合、旧来のGNU diffでは作業が行いにくい場合があります。今回紹介するdyffを使えば、diffでは対応できないケースでも比較が行え、作業が容易になります。

diffでダメなケース
1. 書式は変わるが値は変わらない
フォーマッタやコード生成のツールなどを利用した場合に、YAMLの値としては同じでもテキストの記述としては変更されていることがあります。
- 変更前
# line.yaml on: issues: types: - opened - labeled
- 変更後
# bracket.yaml on: issues: types: [opened, labeled]
こちらの2つをdiffで比較すると異なったものとして扱われます。diffとしては正しい挙動ですが、比較対象として無視したいこともあります。
$ diff -u line.yaml bracket.yaml (snip) - types: - - opened - - labeled + types: [opened, labeled]
2. 差分があるがdiffでは見にくい
次にCI/CDのツールでジョブの間に別のジョブを挿入するみたいなケースでは、変更箇所の比較がやや複雑になります。
- 変更前
# before.yaml jobs: build: requires: [~commit] template: build deploy: requires: [build] template: deploy
- 変更後
# after.yaml jobs: build: requires: [~commit] template: build before_deploy: requires: [build] template: before_deploy deploy: requires: [before_deploy] template: deploy
これをdiffで比較すると以下のようになります。
$ diff -u before.yaml after.yaml (snip) build: requires: [~commit] template: build - deploy: + before_deploy: requires: [build] + template: before_deploy + deploy: + requires: [before_deploy] template: deploy
行ごとに比較するとマーカーの示すとおりです。しかしYAMLとして before_deploy
が挿入されたということは、ぱっと見では理解することはできないです。
こうした時にdyffが役に立ちます。
dyffを使うと
dyff はOSSのツールでYAMLの比較に特化しています。読みはdiff(ディフ)と同じだと思います。
早速上記のケースをdyffで比較してみましょう。dyffにはいくつかのサブコマンドがあり比較する場合にはbetweenを使用します。
1. 書式は変わるが値は変わらない
diffでは差分が出力されますが無視してほしいケースです。
$ dyff between line.yaml bracket.yaml _ __ __ _| |_ _ / _|/ _| between line.yaml / _' | | | | |_| |_ and bracket.yaml | (_| | |_| | _| _| \__,_|\__, |_| |_| returned no differences |___/
2つのファイルには差分がないと表示されています。YAML上の値が変わらないのでちゃんと変更がないと判断されていますね。
2. 差分があるがdiffでは見にくい
diffでは変更の確認が行いづらかったケースです。
$ dyff between before.yaml after.yaml _ __ __ _| |_ _ / _|/ _| between before.yaml / _' | | | | |_| |_ and after.yaml | (_| | |_| | _| _| \__,_|\__, |_| |_| returned two differences |___/ jobs + one map entry added: before_deploy: │ requires: │ - build │ template: before_deploy jobs.deploy.requires.0 ± value change - build + before_deploy
jobs
に1つマップが追加されたこと、deploy
の中の requires
の0番目が変更されたこと、が示されています。こちらもきちんとYAMLで意味のある変更箇所として識別されており、比較結果を理解するにはわかりやすく十分な情報ですね。
ところで、自己主張が強いツールのようで、アスキーアートの dyff
の部分を消すことは現状できなさそうです。
おわりに
現状はdiffで比較しつつ「よくわからん!」となったときにdyffを使用するという使い方をしています。先の例のように論理的な違いがないとわかっていてもつい実際の変更箇所を確認したくなったりするからです。
そのような使い方でも変更箇所が理解しやすくなるのは間違いないので、是非お試しください。