スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

rbenv init が重い問題に対する対処法

Ruby界隈ではRubyのバージョン管理として
rvm から rbenv へシフトしている方が多いかと思うのですが、
この rbenv には少し問題があり、
予めシェルのプロファイルに初期化処理を記述しておく必要があります。
この初期化処理が結構重いです。

初期化処理とはこれ。
eval "$(rbenv init -)"


環境にもよると思いますが、
私が普段利用しているMac+zsh環境では2、3秒掛かることが頻繁にあります。
(キャッシュのヒット率によっては一瞬で起動することもありますが)
Linuxでは問題なかったので、Macだけかも知れません。

とはいえ、頻繁にサーバに接続するためにターミナルを立ち上げたり閉じたりを繰り返すので、
そのターミナルが起動するたびに2、3秒掛かってしまうと結構なストレスです。

とりあえず、この rbenv が何をやっているのか見てみました。
(echo "$(rbenv init -)" で出力したものです)

export PATH="/Users/(ユーザ)/.rbenv/shims:${PATH}"
source "/usr/local/Cellar/rbenv/0.4.0/libexec/../completions/rbenv.zsh"
rbenv rehash 2>/dev/null
rbenv() {
typeset command
command="$1"
if [ "$#" -gt 0 ]; then
shift
fi

case "$command" in
rehash|shell)
eval `rbenv "sh-$command" "$@"`;;
*)
command rbenv "$command" "$@";;
esac
}


これを見ると、

1. $HOME/.rbenv/shims へパスを通す
2. rbenv のサブコマンドの補完処理を可能にするスクリプトの実行 (上記はzshの場合。bashだと rbenv.bash になる)
3. rehash処理
4. rbenv実行時の引数処理定義

をやっているみたいです。

で、端的に言うとこの中で一番重いのは3のrehash 処理になります。
rehashを毎回シェルを起動するときに行う必要なんてないので、
これを省いて見ます。
手順としては以下のとおりです。

1. rbenv init -をファイルに書き出す
echo "$(rbenv init -)" > ~/.rbenv_init


2. 書きだしたファイルから rehash 処理を取り除く
export PATH="/Users/(ユーザ)/.rbenv/shims:${PATH}"
source "/usr/local/Cellar/rbenv/0.4.0/libexec/../completions/rbenv.zsh"
# rbenv rehash 2>/dev/null ← これいらない
rbenv() {
typeset command
command="$1"
if [ "$#" -gt 0 ]; then
shift
fi

case "$command" in
rehash|shell)
eval `rbenv "sh-$command" "$@"`;;
*)
command rbenv "$command" "$@";;
esac
}


3. 使用しているシェルのプロファイル(.bash_profile、.zshrc など)に作成したファイルの読み込み処理を書く
source ~/.rbenv_init

※eval "$(rbenv init -)"の記述は不要になるので削除しておいてください

これでターミナルの起動時に2、3秒掛かることはなくなりました。
ただ、rehashが自動で実行されなくなるため、
手動で実行するのを忘れないように注意する必要はあります。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

Author:Kou
モバイル関連の開発ばかりやってる人のブログです。たまにWebもやります。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。