[ruby-list:45460] Re: やっぱりrubygemの仕組みがいまいち分かりません
From:
Akira Hayakawa <ruby@...>
Date:
2008-08-31 08:25:29 UTC
List:
ruby-list #45460
On Sun, 31 Aug 2008 17:16:43 +0900 "Manabu Shibata" <manabu.shibata@gmail.com> wrote: > 柴田です。横から失礼します。 > > gemは環境変数PATHに先に出てくるものを使います。 > > なので単にgemを実行すると(先にMatzRubyが設定されていれば)MatzRubyをつかうgemがキックされます。 > > JRubyのインストール方法(http://wiki.jruby.org/wiki/Getting_Started)に記載されていますが > JRubyとMatzRuby を共存する場合、JRubyの設定はPATH変数の最後に追記し、 > JRuby用のスクリプト群(gem, rails, cap)は常に > jruby -S gem ...のようにjruby -S経由で実行するのが推奨されています。 すごく、面倒ですね。 > > -Sオプションを使うと、JRubyのbinディレクトリにあるgemコマンド(#!もjruby用になっています)が使用され、 > JRubyインストール先配下のlib/ruby/gemsにgemをインストールしたり使用したりしてくれます。 > > JRubyでは一部のCを使っているgemが使えないので、JRuby用にカスタマイズされてたりします。 確かに、jrubyでは、Rubyの得意なCへの橋渡しが出来ませんね。 JNIだかJNAだかというのを実装しようという風にネットに書いてあったかと思いますが、javaにすると便利な事もあれ、不便な事もあるという事ですか。 > なので、rubygemはそれぞれ分けてインストールしておくほうが良いでしょう。 > (といってもJRubyは標準でrubygemがついてくるのでsetup.rb不要です) > > > 2008/08/31 16:19 Akira Hayakawa <ruby@i-mail.jp>: > > On Sun, 31 Aug 2008 13:16:54 +0900 > > rubikitch@ruby-lang.org wrote: > > > >> 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は正しい場所にファイルを配置します。 > > 同じディレクトリにあるRakefileというのは何か関係があるのでしょうか? > > 例えばGNUmakeでしたら、configure.inだとか、Makefileなるものがあって、それを使ってインストールするのでしょうけど、 > > ruby setup.rb > > と単にやると、上記の3つが自動的に全部行われるという解釈で良いのでしょうか? > > > >> > >> ここで「ruby」コマンドでsetup.rbを実行したため、which rubyが指す > >> Rubyインタプリタ(MatzRuby)の設定でインストールされます。 > > つまり、あるgemコマンド(バイナリかと思ってたら、拡張子がついてないだけでrubyスクリプトでした。そういえば、こんな事も出来るのですね)がどう振る舞うかは、それをどのインタプリタで動かすかに依るとうい事ですね。つまり、単にgemとした場合、$PATHを先から読んでいって、gemを見つければそれを一番上に書いてあるインタプリタで実行して、そのインタプリタのロードパスに入れると。 > > 私のPATH環境変数は > > akira@akira-desktop:/usr/local/bin$ echo $PATH > > /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/jruby/bin > > となっていて、もうパスが必要ならなんでも書いてしまえ方式でやってるのですが、これならば先に/usr/local/bin/gemがヒットするので、そちらの方を実行する。 > > 仮に、jruby -S gemとした場合は、その時にインタプリタが違うという風に判断して、先に進んで、/usr/local/jruby/bin/gemにヒットして、jrubyがインタプリタなので実行するという事になる。 > > > > なので、2つのインタプリタがあるならば、それぞれrubygemをインストールする必要があるという事ですね? > > (仮に、ruby setup.rbのあとにjruby setup.rbとしたら、そのgemは両方のインタプリタで実行出来るという仕様ならば、システム中にいくつrubyインタプリタがあれども1つのgemで済ます事が出来るという事になりますが) > > > >> > >> > 2)ここでjruby setup.rbとすると何か違う結果になったのでしょうか? > >> > >> jrubyの設定でインストールされます。 > >> > >> > 3)gemがシステム中に2つ存在する意味はありますか? > >> > >> RubyGemsライブラリをRubyインタプリタごとにインストールしておくと、 > >> ロードパスをいじらなくてもRubyインタプリタに応じた場所のRubyGemsライブ > >> ラリを使います。 > >> > >> gemコマンドそのものはどのRubyインタプリタでも実行可能です。 > >> ただ、「sudo gem」と実行すると#!に書かれたRubyインタプリタで実行します。 > > これは未確認ですが、強引に実行する場合は、 > > $jruby -S /usr/local/bin/gem > > という風に実行すれば、仮にそのgemに#!/usr/local/bin/rubyと書いてあったとしても、そのgemを使って、自分のロードパスにインストール出来るという事でしょうか?非常に危険な香りがしますが。 > > > >> > >> # 同じものが複数のディレクトリにあるのはいささか気持ち悪いけれど… > > そうですね。私自身、jrubyを使うにしてもswingとjava3dなどのGUIライブラリしか使わないので、CRubyの方でそういうののラッパーがあればそれで終わってしまう話かなと思ったりします。 > >> > >> > 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> > >> > >> とコマンドを使い分けるのが無難です。うまくいくでしょうか? > > > > つまり両方それぞれにgemインストールして、使い分ければいいという事ですね。 > > > > なんとなく、さっきまでほどには気持ち悪さがなくなったような気がするので、 > > あとはRubyが読めるようになって、gemなどのスクリプトを解読すれば納得出来るかと思います。 > > linuxに関する知識もまばらなのでこういう話は混乱しやすいです。 > > rubygemは/usr/localに解凍して良かったのでしょうか?それとも、/usr/local/srcに解凍すべきだったのでしょうか? > > jrubyなども同様にして、/usr/localにsvnで引っ張ってきてしまっていますけど。 > > > > akira@akira-desktop:/usr/local/rubygems-1.2.0$ ls /usr/local/src > > ruby tijmp-0.7 > > > > C言語のmakeが必要なものは、/usr/local/srcに入れて、他は/usr/localに入れようという方針ですが、これってやっぱり間違ってますか? > > > > それと、生粋のRubyistさんは、CRubyでなくMatzRubyと呼ぶのですね、失礼しました。 > > これからMatzRubyと呼ばせていただきます。 > > > >> > >> -- > >> rubikitch > >> Blog: http://d.hatena.ne.jp/rubikitch/ > >> Site: http://www.rubyist.net/~rubikitch/ > >> > >> > > > > > > -- > > Akira Hayakawa <ruby@i-mail.jp> > > > > > > > > -- > 柴田 真武 > Manabu Shibata > > manabu.shibata@gmail.com > > -- Akira Hayakawa <ruby@i-mail.jp>