Rubyistみたいな

2009-06-11

Ruby 1.9.1で $HOME/.gem/ruby/1.9.1 以下のGemパッケージを使う方法

| 16:38

正しい方法かは知らないけど、とりあえず使うために頑張ってみる。

require "rubygems/custom_require" をする

デフォルトでKernel.#requireを上書きするとかそんなことをやらないようにか、rubygems.rb内で、RUBY_VERSIONが1.9以上の場合はrubygems/custom_requireを読まないようになっています。なのでこいつを明示的に読むようにしてやれば一応は動きます。

Kernel#gem を使う

詳しくはbitclust辺りを参照。

指定された Gem をロードする前にその Gem が必要とする Gem をロードします。バージョン情報を省略した場合は、最も高いバージョンの Gem をロードします。指定された Gem やその Gem が必要とする Gem が見つからなかった場合は Gem::LoadError が発生します。

bitclust

ただ、るりまには上のように書いてあるのですが、バージョン情報を省略したらGem::LoadErrorが発生しました。仕方がないので最新バージョンの Gem をロードするためにひと手間かけました。

spec = Gem.searcher.find "hoge" # "hoge"に使用する Gem の名前を指定する
gem spec.name, "= #{spec.version}"
require spec.name

やっている事は rubygems/custom_require でやっていることと変わりありません。Gem.activateを使うかKernel#gemを使うかの違い。

Gem::QuickLoader.load_full_rubygems_library を使う方法

これはRuby 1.8.x以下でrequire "rubygems"としたのと全く同じ状態になるもの、だと思う。

多分各々が呼ぶべきものではないと思うのだけど、Ruby 1.9.1のソース内を探索していたらこんなものを見つけたので、せっかくなので使ってみる。

yharayhara2009/10/03 17:37trunkの7/30のコミットで、1.9でも普通に~/.gemからロードできるように直っているそうです。
Ruby 1.9.2 (あるいは、1.9.2-preview2) では上記の作業は不要になりますね。

MccadeMccade2016/05/07 16:08The price is certainly right, but I think I have moved on from McAfee in a permanent sense. The antivirus I run now is so far beyond that they were able to offer me, that I cannot see myself ever going ba3c;#82k0&nor would I ever want to.

2009-06-05

Rubygemsパッケージとか $HOME/.gem 以下にインストールするだろjk

| 17:05

/usr/bin/* を勝手に荒らされるという話。

404 Not Found

Rubygems 1.3.0から Gem.user_dir というメソッドが追加されていて、gemコマンドでインストールされるディレクトリにデフォルトで $HOME/.gem 以下も追加してくれています。しかもこれ、Rubyの処理系ごと(1.8.x,1.9.x,JRuby等)にディレクトリを分けてくれます。

例えば1.8.xの場合

$HOME/.gem/ruby/1.8

1.9.xの場合

$HOME/.gem/ruby/1.9.1

JRubyの場合

$HOME/.gem/jruby/1.8

となります。

ただ、JRuby--1.9オプションを付けてgemを実行しても、 $HOME/.gem/jruby/1.8 になってしまう問題はあります。Rubygemsはバージョン指定の部分はRbConfig::CONFIG['ruby_version']を取って指定しているだけなので、1.9.1でなくて1.8を返しているJRuby側の問題っぽいです。

デフォルト以外の場所にインストールする場合、環境変数GEM_HOMEを指定しちゃう方法が一番有名かもしれません。

たぶん、環境変数 GEM_HOME をローカルのどこかに設定してユーザー権限で gem install すればうまくいくんじゃないでしょか。

はてなダイアリー

これだと1.8.xだろうが1.9.xだろうがJRubyだろうが同じディレクトリのgemを参照することになり、なんとも気持ち悪いことになってしまいます。単一処理系しか動かさないのなら問題はありませんが、複数処理系を動かす場合問題が起きてしまうことがあります。

なので僕は基本GEM_HOMEも何も設定せずにユーザ権限で gem install するようにしています。ただ、この場合、処理系の数だけPATHに追加しないといけないので、結構面倒かもしれません。