yae
という YAML の alias を anchor の内容に展開した YAML を出力するコマンドを Go で書きました。
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)