それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyのライブラリの標準ディレクトリ構成を考えて、自作ライブラリを何処に置くべきか思案する

Rubyで作りためたクラスを再利用するために require で入れたいと思った。では何処に置くべきか。perl でいうuse lib; 的なこと。

ruby で ライブラリを置く場所

の3つの選択肢がある。

今日調べたのは site_ruby

$: の場合

$:.unshift "path/to/my/lib"
$LOAD_PATH.unshift "path/to/my/lib"

RUBYLIB の場合

export RUBYLIB=/path/to/my:$RUBYLIB

site_ruby の場合

/path/to/lib/ruby/site_ruby  にファイルを置く

site_rubyとは?

ruby のバージョン番号のディレクトリの下には ruby のバージョン依存のライブラリが入る。 具体的には .../ruby/1.7 は標準添付ライブラリ (ソースツリーの lib/ 以下) である。 また .../ruby/1.7/i686 以下には、バージョン依存でしかも アーキテクチャ依存のファイルが入る。 つまり標準添付の拡張ライブラリ (ソースツリーの ext/ 以下) だ。

$libdir/ruby/site_ruby/$VERSION/
$libdir/ruby/site_ruby/$VERSION/$arch


さらに途中に site_ruby がはさまるっているディレクトリは、 このコンピュータ用の独自ライブラリを入れる場所である。 このディレクトリを指して単に site_ruby と言うことも多い。 ruby はここには何もインストールしないのでユーザの好きな ライブラリを入れて構わない。あるいは、自分でインストール するときにはこちらに入れるべきだ、と言ってもいい。

rubyのファイル構成

(太字は引用者による)

site_ruby はそれ専用

site_ruby は「ユーザーが自分のライブラリ」入れる所。パッケージもここを使う。が、濫用が怖いのでユーザー環境と区別を図るためvendor_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
as `--with-sitedir=DIR' and `--with-vendordir=DIR’.

http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWS
意訳

site_rubyでは満たせなくなった要望、システムベンダーがパッケージ化している場合、site_ruby と vendor_rubyに分けることで混載を可能にしつつめたらやったらな上書きを避ける(ただし site_rubyがvendor_rubyより優先順位を上としている)

ウチの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 を使う

の順です。


*1:デフォルトインストール状態