rbenvでuninstallしたはずのgemに対するスクリプトが~/.rbenv/shimsに残り続けててハマった
rbenv を使っていて gem でライブラリをインストールすると、実行ファイルは ~/.rbenv/shims の下に作られるスクリプト経由で実行されるらしい。
例えば gem で vagrant をインストールしていると、
% which vagrant /Users/fkoji/.rbenv/shims/vagrant
こんな感じになる。
で、例えば複数のバージョンの Ruby で同じ gem をインストールしていると、いずれかのバージョンで gem uninstall をしても、残りのバージョンでアンインストールされてなければ ~/.rbenv/shims の下に起動スクリプトは残ったままになる。
なので、
% vagrant rbenv: vagrant: command not found The `vagrant' command exists in these Ruby versions: 2.0.0-p0
こんな感じで「vagrant コマンドは 2.0.0-p0 のほうにあるよ!」と教えてくれる。
で、何が困ったかというと、gem でインストールした vagrant を uninstall をしてから最新のバージョンの Vagrant をMac用のインストーラーでインストールした時。
gem uninstall vagrant をして rbenv rehsh したのに、なぜか ~/.rbenv/shims にある vagrant が残ったままで、仕方ないので直接 ~/.rbenv/shims/vagrant を削除しても何かのタイミングで再び生成されてしまうという。
で、よくよく調べてみると先に述べたように ~/.rbenv/shims の下のスクリプトは、いずれかのバージョンの Ruby に gem がインストールされていたら、現在有効にしているバージョンにインストールされてなくても生成されるという仕組みでした。
なので、gem で vagrant がインストールされていた全バージョンの Ruby からきちんと vagrant を uninstall して rbenv rehash すると、
% which vagrant /usr/bin/vagrant
無事、 /usr/bin/vagrant が使われるようになったという話。ちょっとハマった。
Stack Overflow に同じ事象の投稿があったけど、これは別の問題だったのだろうか。根本的な原因は同じかも。
» ruby – rbenv continually generating vagrant shim – Stack Overflow
昨日ドットインストールで「Vagrant入門」公開しました。興味あったけどまだ手を出していなかったという方、このタイミングでいかがですか?
ありがとうございます。マジで助かりました。
私の場合、webpackerというgemがwebpackというコマンドをインストールしてしまい、nodeのwebpackが見えなくなっちゃいました。通常webpackerはrailsに入れるものでグローバルには入れません。なんかの折に私が突っ込んでしまったようです。そういう事情なので`rbenv: webpack: command not found`なんかで検索しても全くかかりませんでした。
~/.rbenv/shimsのwebpackを削除してもすぐ現れるのに気づいて、その辺りからこちらにたどり着きました。
コメントありがとうございます。
だいぶ以前の記事でしたがお役に立てたようで良かったです!