環境による設定の差異を吸収するにはSettingslogicがいいという話
だいぶ前に使った内容なので、今は少し違うかもしれませんが、アウトプット大事ということで備忘録。
環境に応じて処理内容を変えたいということはよくあるかと思います。 DEVだったら、この設定を読むとか、APIの呼び元はこっちにするとか。 僕がよく遭遇するものとしては、接続先がDEVとステージングと本番でそれぞれ違っていて、それらの差異をいい感じに吸収させたいなぁというような状況です。
RubyではそういうときにSettingslogicというものがあるようでして、ググってみるといくつか紹介記事もあります。たとえば、以下の様なものがあります。
Railsで定数を一元管理する(settingslogic) - Qiita: この記事ではRailsでの例を載せていますね。めちゃシンプルに実装できる。
Rails 以外で Settingslogic を使う: この記事ではRails以外での例ですね。こちらも簡単にできそうですね。
んで、僕も使ってみたかったのですが、作業ディレクトリ直下には設定ファイルを置きたくなかったので、ディレクトリ構成を考えつつ、Settingslogicを使ってみたという紹介記事になります。
設定
まずインストール。以下はgemの例なので、bundle使ってる方は各自設定をしてください。
$ gem install --no-ri --no-rdoc
次に、以下のようにファイルを作ってください。
$ tree
.
|-- config
| |-- application.yml
| `-- settings_logic.rb
`-- test_scirpt.rb
それぞれのファイルに以下の内容をコピペしてください。
$ cat config/application.yml
defaults: &defaults
base_dir: '/user/local'
development:
<<: *defaults
proxy_ip: '192.168.11.101'
production:
<<: *defaults
proxy_ip: '172.20.11.101'
$ cat config/settings_logic.rb
require 'settingslogic'
class SettingsLogic < Settingslogic
source File.expand_path("../application.yml", __FILE__)
namespace ENV['SCRIPT_ENV']
end
$ cat test_scirpt.rb
require File.expand_path("../config/settings_logic.rb", __FILE__)
puts SettingsLogic.proxy_ip
これで必要なファイルはできました。それぞれのファイルを簡単に説明すると以下のようになります。
- application.yml: 定数を管理するファイル。環境に応じて値が異なるもの、もしくは共通して使えるものを設定するファイル。
- settings_logic.rb: 実行する際に必要となる環境変数を定義して、Settingslogicの使用を可能とするファイル。
- test_scirpt.rb: 実行スクリプト。Settingslogicを用いて定義した定数を利用するファイル。
ここまでできたら、以下で実行。
$ SCRIPT_ENV=development ruby test_scirpt.rb
192.168.11.101
$ SCRIPT_ENV=production ruby test_scirpt.rb
172.20.11.101
環境変数の値に応じて、変数の中身が変わってくれました。簡単でいいですね。
終わりに
あとは、Rubyで定数として定義したりなど実装に合わせて活用することで、柔軟な記述も可能になるかと思います。今回はRubyでやりましたが、こういうのを簡単に使える環境が整っていて、すごく楽ですね。bashでそこそこの規模の処理を書いたときに、Settingslogicがやっていた内容を自分で実装しないといけないことがあって、本来の実装のほうに時間使えればどんなにいいことかとどれだけ思ったか。。。LLはこういう面ですごくいいですね。
ということで、簡単ではありますが、Settingslogicの紹介をしてみました。 不明な点・間違っている点等ありましたら、@masudaK までお願いします!