Rubyで設定ファイルという名のRubyスクリプトファイルを特定の名前空間で展開する

satoyamaが2014/10/23 18:54:38に投稿

Rubyで設定ファイルという名のRubyスクリプトファイルを特定の名前空間で展開する

Rubyのスクリプトファイル中に設定ファイルとして、外だししながら、そのファイル自体は単なるRubyの定数の定義だったという場合、
そのままloadすると、設定値が内部の定数と衝突することがあるので、その回避方法。

設定ファイル例(setting.conf)

LOG_DIR="/any/log/path"
MAX_LOG_FILES=100
module Sandbox
  def self.load_conf(name, file )
    mod = eval("#{name.to_s.capitalize} = Module.new")
    script = File.open(file, "r"){|fs| fs.read}
    mod.module_eval(script, file)
  end
end

LOG_DIR="log"

Sandbox.load_conf  "Abc", "setting.conf"

Sandbox::Abc::LOG_DIR       # => "/any/log/path"
Sandbox::Abc::MAX_LOG_FILES # => 100 

Sandboxが冗長な場合は、include Sandboxをすればよいが、Abcが既存の名前と衝突しないように気をつける。