読者です 読者をやめる 読者になる 読者になる

rbenv rehashを行わなくて良い方法

rvmがオワコン扱いされだしたのはいつの頃からでしょうか?私はrbenvのrehashが嫌でしつこくrvmを使い続けていたのですが、ここ最近のrvmでのrubyインストールの不安定さに嫌気が差してrbenvに乗り換えることにしました。

$ cd
$ rm -rf .rvm
$ brew install rbenv$ brew install ruby-build
$ echo 'eval "$(rbenv init -)"' >> .bash_profile
$ brew install readline
$ rbenv install 1.9.3-p194
$ rbenv global 1.9.3-p194

ちょとirbで動作確認してみます。

a = 1
a = 2
# ↑キーを押してキーヒストリが効くことを確認。readlineがうまく組み込まれてないとヒストリが効かない
require 'psych' #yamlパーサーの確認。rvmはここで詰まることがよくある
require 'zlib' #同じくrvmはここで詰まることがよくある
require 'openssl' #同じく(略)

私の環境では問題ありませんでした。
次にrbenv で gem を使った時に rbenv rehash しなくて良くするというエントリを参考にしてシェルスクリプトで関数定義を行い、gemおよびbundleコマンドのオーバーライドを行いました。私のPCはMacOS Xなんですがrehashコマンドは無いみたいなので参考元のスクリプトからコピーする際に省いています。

$ vi .bash_profile
#適当な場所に定義
function gem(){
  $HOME/.rbenv/shims/gem $*
  if [ "$1" = "install" ] || [ "$1" = "i" ] || [ "$1" = "uninstall" ] || [ "$1" = "uni" ]
  then
    rbenv rehash
  fi
}

function bundle(){
  $HOME/.rbenv/shims/bundle $*
  if [ "$1" = "install" ] || [ "$1" = "update" ]
  then
    rbenv rehash
  fi
}

では試してみましょう。

$ rspec
rbenv: rspec: command not found # rspecコマンドは見つからない
$ gem install rspec
$ rspec
/Users/kazuhisa/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.0/lib/rspec/core/configuration.rb:784:in `load': cannot load such file -- /Users/kazuhisa/spec (LoadError)
#rspecを実行してテストファイルが見つからないのでエラーになってる

自動的にrbenv rehashしてくれてるみたいですね。良い感じです。
しばらくはrbenvを使ってみようと思います。