rbenv install したときに bundler ぐらい自動で入って欲しいですよね。 たぶん。今日、そういうツイートを見ました。

rbenv には hook という機能が用意されているのでこれを利用するとできます。 hook したときに呼ばれるスクリプトは以下の場所に配置できます。

  • ${RBENV_ROOT}/rbenv.d
  • /usr/local/etc/rbenv.d
  • /etc/rbenv.d
  • /usr/lib/rbenv/hooks

環境変数 RBENV_HOOK_PATH を設定すると好きな場所に配置できます。 私はホームディレクトリにおきたいので指定しました。

export RBENV_HOOK_PATH="$HOME/.rbenv.d"

必要に応じて .zshenv.bash_profile などに書き込みましょう。

以下、 .rbenv.d に設定したと仮定して話をします。

rbenv install 時 にhook するスクリプトは .rbenv.d/install におきます。 拡張子を bash にする必要があります。

.rbenv.d/install/install_bundler.bash というファイルを作成して、

#/bin/sh

after_install 'RBENV_VERSION="$VERSION_NAME" gem install bundler'

とかいておけばOKです。

$ rbenv hooks install

で rbenv install で hook される script を確認することができます。

rbenv-hooksというリポジトリをつくったので、作るのがめんどくさい人は環境変数を設定して、clone してください。

$ git clone git://github.com/eiel/rbenv-hooks.git ~/.rbenv.d

READMEかかなきゃ…。

もうちょっと詳しく

after_install というのは ruby-buildの rbenv-install で定義されてる関数です。 同様の関数として before_install があります。 このへんは ruby-buildの独自機能のようです。

rbenv hooks 自体は rbenv の機能です。 rbenv の各コマンド実行後に実行したいスクリプトがあれば、同じ手法が使えます。

ただ、対応してないコマンドもあるようなので、使いたくなったら、適当に追記して pull request すればよいと思います。(たぶん)

# Load plugin hooks.
for script in $(rbenv-hooks コマンド名); do
  source "$script"
done

とすると、hook を実行することができます。

hook の一覧を取得してひとつづつ source するだけみたいです。

おまけ hook を書くときの debug の方法

hook をかくときにどのような変数が定義されてるかは set というコマンドを使えばわかります。 ファイルをつくったら set を利用して使いたい値がないか探してみましょう。

関連