From: rubikitch@... Date: 2008-08-31T17:10:04+09:00 Subject: [ruby-list:45457] Re: やっぱりrubygemの仕組みがいまいち分かりません From: Akira Hayakawa 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/