From: Akira Hayakawa <ruby / i-mail.jp>
Subject: [ruby-list:45449] やっぱりrubygemの仕組みがいまいち分かりません
Date: Sun, 31 Aug 2008 12:45:31 +0900

> 今、私は、
> http://rubyforge.org/frs/?group_id=126
> ここより、rubygem-1.2.0.zipをダウンロードし、/usr/localに展開しました。
> 
> ディレクトリの構成は
> akira@akira-desktop:/usr/local/rubygems-1.2.0$ ls /usr/local
> bin  eclipse  etc  games  include  jruby  jude_community  lib  man  rubygems-1.2.0  sbin  share  src
> 
> 私は、rubygemをインストールすべく、rubygemのディレクトリに移り、
> $sudo ruby setup.rb
> を実行しました。インストールは成功し、/usr/local/bin/gemにgemというバイナリがインストールされました。
> ちなみに最初にインストールした時にzlibがないというエラーメッセージが出たので、
> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43256
> を参考にして解決しました。
> 
> ここでwhich gemとすると、
> akira@akira-desktop:/usr/local/rubygems-1.2.0$ which gem
> /usr/local/bin/gem
> 
> と表示されてしまいました。

ここまでは期待通りです。

> 1)ruby setup.rbは何の意味があるのですか?

setup.rbはRubyスクリプト・拡張ライブラリのde facto standardなインストーラです。

ruby setup.rbは以下の3つのコマンドの略です。
* ruby setup.rb config
* ruby setup.rb setup
* ruby setup.rb install

configは現在の設定を得ます。現在のRubyインタプリタに合わせたインストー
ル場所を得ます。

setupは#!のパスを書き換えたり、拡張ライブラリのコンパイルをします。
RubyGemsはpure rubyなのでgemコマンドの#!を書き換えるくらいでしょう。

installは正しい場所にファイルを配置します。

ここで「ruby」コマンドでsetup.rbを実行したため、which rubyが指す
Rubyインタプリタ(MatzRuby)の設定でインストールされます。

> 2)ここでjruby setup.rbとすると何か違う結果になったのでしょうか?

jrubyの設定でインストールされます。

> 3)gemがシステム中に2つ存在する意味はありますか?

RubyGemsライブラリをRubyインタプリタごとにインストールしておくと、
ロードパスをいじらなくてもRubyインタプリタに応じた場所のRubyGemsライブ
ラリを使います。

gemコマンドそのものはどのRubyインタプリタでも実行可能です。
ただ、「sudo gem」と実行すると#!に書かれたRubyインタプリタで実行します。

# 同じものが複数のディレクトリにあるのはいささか気持ち悪いけれど…

> 4)
> 
> ロードパスを調べると、
> 
> akira@akira-desktop:/usr/local/rubygems-1.2.0$ ruby -e 'puts $:'
> /usr/local/lib/ruby/site_ruby/1.8
> /usr/local/lib/ruby/site_ruby/1.8/i686-linux
> /usr/local/lib/ruby/site_ruby
> /usr/local/lib/ruby/vendor_ruby/1.8
> /usr/local/lib/ruby/vendor_ruby/1.8/i686-linux
> /usr/local/lib/ruby/vendor_ruby
> /usr/local/lib/ruby/1.8
> /usr/local/lib/ruby/1.8/i686-linux
> .
> akira@akira-desktop:/usr/local/rubygems-1.2.0$ jruby -e 'puts $:'
> /usr/local/jruby/lib/ruby/site_ruby/1.8
> /usr/local/jruby/lib/ruby/site_ruby
> /usr/local/jruby/lib/ruby/1.8
> /usr/local/jruby/lib/ruby/1.8/java
> lib/ruby/1.8
> 
> と表示されます。
> 
> この状態で、
> $sudo ruby -S gem install <package_name>
> とする時と、
> $sudo jruby -S gem install <package_name>
> とする場合にgemは何をしているのでしょうか?

PATHから探すので /usr/local/bin/gem です。
「sudo which gem」で検証できます。

ただし環境変数RUBYPATHが設定されている場合は、そこに置いてあるコマンド
が使われます。

> この状態で単に
> $sudo gem install ruby-debug-base --include-dependencies
> とすると、rubyのロードパスの方のgemsディレクトリに入ったのですが、
> 以前はgemとするとjrubyのロードパスの方に入れていたgemというコマンドがなぜ急にCRubyの方に肩入れするようになったのでしょうか?

sudo gemが /usr/local/bin/gem を実行したためです。
/usr/local/bin/gemの1行目が #!/usr/local/bin/ruby となっているから MatzRuby が
デフォルトで実行されます。

> 5)rubygemをダウンロードせずに、jrubyに付属のgemコマンドを利用して、CRubyのgemsディレクトリにgemを入れていく方法はあったのでしょうか?

sudo ruby -I /usr/local/jruby/lib/ruby/site_ruby/1.8 /usr/local/jruby/bin/gem install <package_name>

かな…。 おすすめできませんが。
素直に双方のバージョンのRubyGemsをインストールしたほうがいいと思います。

====
とにかく、複数のRubyインタプリタが存在する場合は

sudo ruby -S gem install <package_name>
sudo jruby -S gem install <package_name>

とコマンドを使い分けるのが無難です。うまくいくでしょうか?

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/