Rubyで作りためたクラスを再利用するために require で入れたいと思った。では何処に置くべきか。perl でいうuse lib; 的なこと。
$: の場合
$:.unshift "path/to/my/lib" $LOAD_PATH.unshift "path/to/my/lib"
RUBYLIB の場合
export RUBYLIB=/path/to/my:$RUBYLIB
site_rubyとは?
ruby のバージョン番号のディレクトリの下には ruby のバージョン依存のライブラリが入る。 具体的には .../ruby/1.7 は標準添付ライブラリ (ソースツリーの lib/ 以下) である。 また .../ruby/1.7/i686 以下には、バージョン依存でしかも アーキテクチャ依存のファイルが入る。 つまり標準添付の拡張ライブラリ (ソースツリーの ext/ 以下) だ。
$libdir/ruby/site_ruby/$VERSION/ $libdir/ruby/site_ruby/$VERSION/$archrubyのファイル構成
さらに途中に site_ruby がはさまるっているディレクトリは、 このコンピュータ用の独自ライブラリを入れる場所である。 このディレクトリを指して単に site_ruby と言うことも多い。 ruby はここには何もインストールしないのでユーザの好きな ライブラリを入れて構わない。あるいは、自分でインストール するときにはこちらに入れるべきだ、と言ってもいい。
(太字は引用者による)
vendor_rubyは 1.8.7から導入された比較的新しいディレクトリ
vendor_ruby directory
A new library directory named `vendor_ruby' is introduced in
addition to `site_ruby'. The idea is to separate libraries
installed by the package system (`vendor') from manually (`site')
installed libraries preventing the former from getting overwritten
by the latter, while preserving the user option to override vendor
libraries with site libraries. (`site_ruby' takes precedence over
`vendor_ruby')If you are a package maintainer, make each library package configure
the library passing the `--vendor' option to `extconf.rb' so that
the library files will get installed under `vendor_ruby'.You can change the directory locations using configure options such
http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWS
as `--with-sitedir=DIR' and `--with-vendordir=DIR’.
ウチのRVMの場合・・・
じゃぁ、/usr/lib/ruby/site_ruby に置けばいいんだ。
ちょっとまって、RVM環境ならちょっとまって。
実際のsite_ruby を見てみる。
/Users/takuya/.rvm/rubies/ruby-1.8.7-p357/lib/ruby └── ruby ├── 1.8 #標準添付ライブラリ ├── gems # gem が入る場所 ├── site_ruby #ユーザーがここに自由に入れる場所 └── vendor_ruby
また、バージョン単位で存在する。
echo /Users/takuya/.rvm/rubies/ruby*/lib/ruby /Users/takuya/.rvm/rubies/ruby-1.8.7-p357/lib/ruby /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby
となっている。
つまり、自分ライブラリはsite_ruby に置けばいい?
自分で作ったライブラリを置くには site_ruby に置く。ただしRVM*1は例外。
rvm の 1.8.7
ruby -e "puts $:.grep /site_ruby/ " /Users/takuya/.rvm/rubies/ruby-1.8.7-p357/lib/ruby/site_ruby/1.8 /Users/takuya/.rvm/rubies/ruby-1.8.7-p357/lib/ruby/site_ruby/1.8/i686-darwin11.3.0 /Users/takuya/.rvm/rubies/ruby-1.8.7-p357/lib/ruby/site_ruby
rvm の 1.9.3
ruby -e "puts $:.grep /site_ruby/ " /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/site_ruby/1.9.1 /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.2.0 /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/site_ruby
このsite_ruby 直下に置けばいい。
ただし、RVMのruby の インストールは、lib を分けてしまう。libを共有して欲しい所である。
rvm は 1.8 1.9 それぞれで lib を作ってしまう。バージョンを超えて lib が適用されない。
/usr/lib/ruby に1.8も.1.9もバージョン違いのsite_ruby を構成できるようにlib が設計に指定あるのだ。rvmはそれに従って欲しい。
rubygems / rvm / MacOSX 添付 と ruby の実装は違えど/usr/lib/ruby は共有して欲しい所。。。そういう場合はコンパイルオプションを使っておく --use-lib-dir=/usr/libなどと使う。
ということで、RVMをそのまま使っているときは、 site_ruby が使いにくい感じになってる。
takuya_1stのお薦めは
- $RUBYLIBを使う
- $:を使う
- site_riby を使う
の順です。
参考
http://i.loveruby.net/ja/rhg/book/load.html
http://d.hatena.ne.jp/takuya_1st/20091231/1262269191
http://blog.s21g.com/articles/1387
*1:デフォルトインストール状態