rake aborted! Gem::LoadError: You have already activated rake *.*.*, but your Gemfile requires rake **.**.**. の解決方法
rakeコマンドを実行したときに時々起こる、rake aborted! の解決方法
結論。
rake ***
ではなく、
bundle exec rake ***
を使いましょう。
解説
まずはエラー文を確認
今回のエラー文を見てみましょう。
Gem::LoadError: You have already activated rake 12.0.0, but your Gemfile requires rake 11.2.2
この場合、
今使っているrakeコマンドのバージョンは12.0.0ですが、
Gemfileでは11.2.2のバージョンが指定されてますよ。
と伝えてくれています。
実は今回の場合、
rake ***
で実行された場合は12.0.0のバージョンが使われます。
bundle exec rake ***
で実行した場合は11.2.2のバージョンが使われます。
そしてこの場合はエラーが起きません。
なぜそういうことが起こるのか
rake ***
で実行した場合と、
bundle exec rake ***
で実行した場合とでは、 参照しているrakeが異なるからです。
それぞれどのrakeを参照しているのか
まずは
rake ***
がどのrakeを参照しているのか調べてみましょう。
gem environment
とすると、 色々出てくるのですが、
- GEM PATHS: - /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0 - /home/vagrant/.gem/ruby/2.3.0
こちらのGEM PATHSにアクセスし、フォルダ内に入っているものをみてみましょう。
大量のgemが見つかりました。
これらは、今まで
bundle install
してinstallしてきたgemたちです。バージョン違いのgemがいっぱいあって恐ろしいですね。
rakeはいくつあるのか
ls | grep rake
をすると、
以上の3つのrakeが見つかりました。
rake *** を実行すると
この中の最新バージョンである12.0.0が実行されます。
なお、
rake -V
をすると、installされている最新バージョンが確認できます。
bundle exec rake *** を実行すると
「プロジェクトディレクトリ下のGemfile.lockに記載されているrakeのバージョン」が使用されます。
今回の場合は11.2.2ですね。
なお、
bundle exec rake --version
をすると、使用されるrakeのバージョンが確認できます。
解決策
プロジェクトで使っているrakeのバージョンと、異なるバージョンのrakeを使おうとするととエラーが起こるので、
基本的に
bundle exec rake ***
を使用するようにしましょう。
その他の解決策
gem install時にbundle install をするのではなく、
bundle install --path vendor/bundle
として、
gemはプロジェクト毎に管理しましょう(推奨)
こうすると、vendor/bundle内でgemが管理できるので、
複数のバージョンのgemが混在することがなくなります。
参考: http://dev.classmethod.jp/server-side/language/bundler-gem-management/