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

# メールには適宜改行を入れましょう。

> 同じディレクトリにあるRakefileというのは何か関係があるのでしょうか?
> 例えばGNUmakeでしたら、configure.inだとか、Makefileなるものがあって、
> それを使ってインストールするのでしょうけど、ruby setup.rb と単にやる
> と、上記の3つが自動的に全部行われるという解釈で良いのでしょうか?

Rakefileとsetup.rbは独立した存在です。
インストールに関してはsetup.rbを使えばよいです。

というか、Rubyスクリプトをリリースする場合はsetup.rbを入れておくのが
慣例となっています。ユーザーにとってはインストールが楽ですから。

名前からわかるようにRakefileはMakefileのRuby版です。
あくまでも開発者がパッケージングに使うものであることが多いです。

> > ここで「ruby」コマンドでsetup.rbを実行したため、which rubyが指す
> > Rubyインタプリタ(MatzRuby)の設定でインストールされます。
> つまり、あるgemコマンド(バイナリかと思ってたら、拡張子がついてないだ
> けでrubyスクリプトでした。そういえば、こんな事も出来るのですね)がど
> う振る舞うかは、それをどのインタプリタで動かすかに依るとうい事ですね。
> つまり、単にgemとした場合、$PATHを先から読んでいって、gemを見つければ
> それを一番上に書いてあるインタプリタで実行して、そのインタプリタのロー
> ドパスに入れると。

ロードパスに入れるのではなくて、Rubyインタプリタが起動された時点でロー
ドパスは決まっています。

> 私の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がイ
> ンタプリタなので実行するという事になる。

違う違う。 jruby -S gem とした場合でも PATH からスクリプトを検索するの
で /usr/local/bin/gem が実行されます。
#!とは食い違っているけど、jrubyで /usr/local/bin/gem が実行されます。

それは別に気持ち悪いことではありません。
gemスクリプト自体インタプリタに依存しているわけではないので、gemスクリプトが
Rubyインタプリタに合ったRubyGemsライブラリを読み込みます。

同じスクリプトを複数のRubyインタプリタで動かすことはよくあります。

> > gemコマンドそのものはどのRubyインタプリタでも実行可能です。
> > ただ、「sudo gem」と実行すると#!に書かれたRubyインタプリタで実行します。
> これは未確認ですが、強引に実行する場合は、
> $jruby -S /usr/local/bin/gem
> という風に実行すれば、仮にそのgemに#!/usr/local/bin/rubyと書いてあっ
> たとしても、そのgemを使って、自分のロードパスにインストール出来るとい
> う事でしょうか?非常に危険な香りがしますが。

jruby -S /usr/local/bin/gem‥というか jruby /usr/local/bin/gem でも
普通に実行できます。 全然危険ではないです。

> linuxに関する知識もまばらなのでこういう話は混乱しやすいです。

たしかに最初のうちはそれがGNU/Linuxの問題なのか、Rubyの問題なのか切り分
けが難しいです。

> 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に入
> れようという方針ですが、これってやっぱり間違ってますか?

解凍はどこでもいいです。
普通ならばユーザー権限でホームディレクトリの孫あたりに展開すると思います。
僕ならば ~/src とか ~/compile とかの下ですね。


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