Wednesday, February 27, 2013

bundle コマンドで "Could not find rubygems-bundler" エラー

rvm + bundler な環境で、以下のようなエラーが出るようになってしまいました。

Error loading RubyGems plugin ....: Could not find rubygems-bundler (>= 0) amongst [....] (Gem::LoadError)

https://rvm.io/integration/bundler/ を見ると、rubygems-bundler なる gem がデフォルトで有効になったらしく binstubs の shebangruby から ruby_noexec_wrapper に切り替わっていました。

% head -n 1 `which bundle`
#!/usr/bin/env ruby_noexec_wrapper

--path vendor/bundle のようなローカルのディレクトリに gem をインストールしているケースでは rubygems-bundler は入っていないわけで、当たり前ですが Could not find rubygems-bundler となることがわかりました。他の環境で ruby_noexec_wrapper に切り替えてみると、同様のエラーが再現しました。

# rubygems-bundler によって追加された regenerate_binstubs を実行
% gem regenerate_binstubs
...

% head -n 1 `which bundle`
#!/usr/bin/env ruby_noexec_wrapper

% bundle update
Error loading RubyGems plugin ....

rubygems-bundler は bundle exec を使わずに済む gem のようですが、Bundler がまともに動かなくなるのは意味がないため、rubygems-bundler@github にある通り rubygems-bundler-uninstaller というコマンドで無効にしました。元の ruby に書き代わり、エラーも出なくなりました。

% rubygems-bundler-uninstaller
....
% head -n 1 `which bundle`
#!/usr/bin/env ruby

個人的には、確実に Gemfile で指定した gem を使うために、面倒でも bundle exec をつけるなり、必要な binstub だけ設置するほうが良いと思います。