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

rbenv で gem を使った時に rbenv rehash しなくて良くする

Ruby rbenv

rvm が多機能&壊れやすすぎて Homebrew の ruby を直にインストールして使っていたのですが,Homebrew の ruby はバージョンを上げるときにgemで入れたコマンドを引き継いでくれなかったり,gemでインストールしたコマンドを反映してくれないので,rbenv という ruby のパッケージマネージャを使ってみる事にしました.

しかし,rbenvも若干面倒なところがあり,gemでインストールしたコマンドを使う前にrbenv rehashをして $HOME/.rvm/shims 以下の情報を更新しなくてはいけません.
そこで,gem でインストールしたときでもいちいち rbenv rehash しなくて良い方法を考えました.

方法1: rbenv-rehash という gem を入れる

% gem install rbenv-rehash

とするとインストールできます.
しかし,複数のRubyを管理している場合,各バージョンのRubyのgemにインストールしておかなければいけません.
また,シェルのビルトインコマンドのほうのrehashのほうは行なってくれないため,そっちは結局手動で更新する必要があります.

方法2: zshの関数でgemコマンドのラッパーをつくる

.zshrc に次のようにgem関数を定義します.

function gem(){
    $HOME/.rbenv/shims/gem $*
    if [ "$1" = "install" ] || [ "$1" = "i" ] || [ "$1" = "uninstall" ] || [ "$1" = "uni" ]
    then
        rbenv rehash
        rehash
    fi
}

これにより,rubygemsをインストールしたあとは必ず rbenv rehash と rehash が走ります.
これなら各Rubyごとにインストールしないといけないといった手間もありません.
bashについては使っていないので分かりませんが,おそらく同じ方法でいけるのではないかと思います.