君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

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にアクセスし、フォルダ内に入っているものをみてみましょう。

f:id:karoten512:20171002233821p:plain

大量のgemが見つかりました。

これらは、今まで

bundle install

してinstallしてきたgemたちです。バージョン違いのgemがいっぱいあって恐ろしいですね。

rakeはいくつあるのか

ls | grep rake

をすると、

f:id:karoten512:20171002233904p:plain

以上の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/