YAMLとは?
YAMLとは、構造化されたデータをプレーンな文字列で表現するためのデータ形式の一つです。
YAMLはRuby関連のライブラリ(特に設定ファイル関連)でよく扱われることもあり、サードパーティのgemを入れなくても標準ライブラリで取り扱いができるようになっています。
設定ファイルとしてよく使われるファイル形式としては、他にはJava文化圏だとpropertiesファイル(最近のSpring FrameworkはYAMLにも対応しているようですが)、JavaScript文化圏だとjsonファイルなどがあります。
本記事では、YAMLファイルを実際に読み込む、あるいはYAMLファイルを書き込む方法について解説します。
YAMLを読み込む
前述したように、YAMLを読み込むモジュールはRuby標準に付属しているため、Gemfileなどの設定は不要です。
いきなり require することで使用することができます。
require 'yaml'
ファイルから読み込む
sample.ymlを用意します。
fuga: foo: 1 bar: 'Hello' baz: ['Ruby','Python']
yaml_load_sample.rbを記述します。
YAML.load_fileメソッドは、YAMLファイルをハッシュとして読み込むことができます。
yaml = YAML.load_file('./sample.yml') puts yml # => {"fuga"=>{"foo"=>1, "bar"=>"Hello", "baz"=>["Ruby", "Python"]}} puts yml['fuga']['bar'] #=> Hello
あるいは、Kernel#openと組み合わせて以下のようにします。
yaml = YAML.load(open('./sample.yml')) puts yml # => {"fuga"=>{"foo"=>1, "bar"=>"Hello", "baz"=>["Ruby", "Python"]}} puts yml['fuga']['bar'] #=> Hello
文字列から読み込む
文字列から読み込む場合はYAML.loadを使います。
yml_str= <<EOS --- fuga: foo: 1 bar: 'Hello' baz: ['Ruby','Python','JavaScript'] EOS puts YAML.load(yml_str)
YAMLファイルに書き込む
YAML.dump(YAML化したいインスタンス)で、YAML形式の文字列にすることができます。
Kernel#openと組み合わせて、外部のyamlファイルに書き出します。
open('write_yml.yml', 'w') do |f| yml = { 'a' => 'This is a', 'b' => false, 'c' => { 'd' => 1, 'e' => 2 } } f.write(YAML.dump(yml)) end
キーが文字列か、Symbolかに注意する
YAMLファイルを読み込む場合は、キーが文字列かシンボルかに注意しましょう。
キーが文字列なのにシンボルで指定するとnilが返ってきます。(たまにハマります)
yml_str= <<EOS --- str: hello,yaml! EOS puts YAML.load(yml_str)['str'] # => hello,yaml! puts YAML.load(yml_str)[:str] # => nil yml_str= <<EOS --- :str: hello,yaml! EOS puts YAML.load(yml_str)['str'] # => nil puts YAML.load(yml_str)[:str] # => hello,yaml!
まとめ
本記事では、YAMLファイルの取り扱いについて解説しました。
環境依存の固定値などはソースコードにベタ打ちするのではなく、設定ファイルとして管理しておくとメンテナンス性が高まります。
YAMLを自由に取り扱えるようになっておくと、メンテナンス性が高いソースコードを書けるようになるので、ぜひ使い方をマスターしておきたいですね。