Shin x Blog

PHPをメインにWebシステムを開発してます。Webシステム開発チームの技術サポートも行っています。

yae - YAML alias を展開して出力するツールを作りました

yae という YAML の alias を anchor の内容に展開した YAML を出力するコマンドを Go で書きました。

github.com

YAML anchor/alias

YAML では、anchor と alias を利用することで、共通のノードをまとめることができます。

下記が、anchor を alias を利用した例です。&book が anchor となっており、*book が alias となっています。これは、&book の内容が、 *book の箇所に展開されるイメージです。また、<<: を使うことで、anchor の内容の一部のキーを上書きすることもできます。

anchors:
  items:
    - &book # anchor
      name: book
      price: 100

stocks:
  - *book # alias
  - <<: *book # merge key
    price: 200 # &book の price を上書き

上の YAML を anchor / alias を使わずに書くと下記のようになります。

anchors:
  items:
  - name: book
    price: 100
stocks:
- name: book
  price: 100
- name: book
  price: 200

https://yaml.org/spec/1.2/spec.html https://yaml.org/type/merge.html

yae

YAML の alias が実際にどのように展開されるかを確認するためにこのツールを作りました。

また、長い YAML を便利な anchor / alias を使って、リファクタリングする時に、元の YAML とリファクタリング後の YAML が同じ内容になっているかを比較するのにも利用できます。

Go で実装したのですが、単に YAML を読んで、出力しているだけです。Go は、こういう小さなツールをサクッと作るのに、ほんと便利ですね。

インストール

yae は、Go で実装したシングルバイナリなので、macOS / Linux 環境では、下記サイトよりバイナリをダウンロードすれば利用できます。

https://github.com/shin1x1/yae/releases

go get でもインストールできます。

$ go get -u github.com/shin1x1/yae

利用方法

yae コマンドで alias を展開したい YAML ファイルを指定するだけです。実行すると、標準出力に展開された YAML が出力されます。なお、出力される YAML は、意味として元のもとと同じですが、インデントなどは整形されます。

$ cat src.yaml
---
anchors:
  items:
    - &book
      name: book
      price: 100

stocks:
  - *book
  - <<: *book
    price: 200

$ yae src.yaml
anchors:
  items:
  - name: book
    price: 100
stocks:
- name: book
  price: 100
- name: book
  price: 200

元の YAML との比較

上述したように、このコマンドでは、リストのインデントやキーの並びのように YAML として意味が変わらない部分は変更される場合があるので、diff を取る場合は、下記のように元の YAML も yae コマンドを通して比較した方が余計な差分が出なくて良いです。

$ diff <(yae base.yaml) <(yae refactored.yaml)