RubyGems でインストールしたライブラリのパス名
AP4R で、サーバ側は ActiveSupport への依存性が無い方が何かと良いかなぁ、と考えて、ちょっとコードをいじっています。気持ちとしては、コアライブラリへの拡張は欲しい(Module#mattr_accessor とか、Number#hours とか)のだけど、自動リロードが気持ち悪い。とういわけで、'active_support/core_ext' だけ読み込んで出来ないかなぁと。
素直に、'rubygems' を読んで、'active_support/core_ext' を読みにいくと、'xml_simple' が無いよというエラーが発生。ちょっと見てみると、active_suport/vendor/xml_simple.rb がそれだ。active_support.rb の中では、$: に自身のファイルパスを使って、 'active_support/vendor' を追加しているのだけど、外からどうにかしたい。
Gem.methods(false) を見てみると、required_location という良さげな名前のメソッドを発見。
% grep required_location /usr/local/ruby/1.8.6/lib/ruby/site_ruby/1.8/**/* /usr/local/ruby/1.8.6/lib/ruby/site_ruby/1.8/rubygems.rb: def required_location(gemname, libfile, *version_constraints)
ほほう〜。
shino@shino-imac% irb -f --simple-prompt >> require 'pp' ... >> require 'rubygems' ... >> gem 'activesupport' ... >> pp $: ["/usr/local/ruby/gemrepository/gems/activesupport-1.4.2/bin", "/usr/local/ruby/gemrepository/gems/activesupport-1.4.2/lib", "/usr/local/ruby/1.8.6/lib/ruby/site_ruby/1.8", "/usr/local/ruby/1.8.6/lib/ruby/site_ruby/1.8/i686-darwin8.9.1", "/usr/local/ruby/1.8.6/lib/ruby/site_ruby", "/usr/local/ruby/1.8.6/lib/ruby/1.8", "/usr/local/ruby/1.8.6/lib/ruby/1.8/i686-darwin8.9.1", "."] => nil >> asv = Gem.required_location 'activesupport', 'active_support/vendor' => "/usr/local/ruby/gemrepository/gems/activesupport-1.4.2/lib/active_support/vendor" >> $:.unshift asv >> require 'active_support/core_ext' => true >> ActiveSupport => ActiveSupport >> Reloadable NameError: uninitialized constant Reloadable ... >> 2.hours => 7200
とここまで書いて、ActiveSupport に依存してもまぁ良いかという気になってきた。せっかく便利なものが有るんだから、明確に問題が有る訳でもないのに制限するのは良くない。ま、RubyGems の使い方を一つ覚えたということで。