[#45318] Windows コマンドプロンプトで UTF-8を出力するには — Yuumi Yoshida <yuumi3@...>

おつかれさまです、 Yuumi3です。

11 messages 2008/08/08

[ruby-list:45454] Re: やっぱりrubygemの仕組みがいまいち分かりません

From: Akira Hayakawa <ruby@...>
Date: 2008-08-31 07:19:29 UTC
List: ruby-list #45454
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>

In This Thread