Ruby
Rails
rake

rakeでエラー You have already activated rake xx.x.x, but your Gemfile requires rake xx.x.x.での対処の仕方 備忘録

More than 1 year has passed since last update.

よく見かけるrake aborted!で二つのrakeのバージョンがみる時

なぜそうなるかというと、複数のファイルでディレクトリ下で、システムでのrakeと独自で動いているファイルとでのrakeのバージョンが異なるが故に発生する。
複数同じディレクトリ下で開発していると下記の様な事が起きるのよく見かける。
rake aborted!
Gem::LoadError: You have already activated rake 10.4.2, but your Gemfile requires rake 10.5.0. Prepending bundle exec to your command may solve this.

rakeコマンドの時にrakeの前に”bin”/や”bundle exec”をつけてコマンドする

これで気がすむなら一番早い。
というよりみんなこれで諦める。
$ bundle exec rake routes

$ bin/rake routes

どうせやるなら修正して見る

まずRubyが連動してRailsとちゃんと動く様に、PATHの確認を。
$ HOME/.rbenv/shims及び  

$ HOME/.rbenv/binの確認。

ターミナルにて
$ env | grep PATH

export PATH="$HOME/.rbenv/bin:$PATH" >> ~/.bash_profile

echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

source ~/.bash_profile

sourceは上記を実行するためのコマンドなので忘れずに。

バージョン管理さえしっかりしていればいい

同じディレクトリ内で複数の開発している時、
bundle installに気をつけなくてはならない。
なぜかというと、すべてのgemがお互いに依存関係から問題を起こし、
複数のgemが連動して、特定のgemが特定のバージョンに依存している場合、
すべてのgemをbundle installしてまうと、
動作してくなるのだ。
これはRailsの弱点の一つなる。

rakeをuninstallして指定し直す。

まず$ rails -vでバージョン確認

rakeも確認する。
$ gem list rake

*** LOCAL GEMS ***

rake (11.3.0)

gem uninstall rake -v 10.4.2

uninsatllする時に注意しなくてはならないのは、
この時にすべてのgemが影響してくる。
メッセージに沿ってyかnを立てよう。
二回聞かれる。

$ bundle update rake
ここまでくるとシステムでのbundleが修正される。

注意してinstallしていく

万が一ファイルごとにrails が消えてしてまったら。
ディレクトリでバージョンを指定してinsatll
$gem install rails --version="4.2.6"

私の場合bundlerを消してしまったので下記のコマンドを行なった。
$ gem update bundler

$ gem install bundler

bundleインストールをしなおした
$ bundle install

ここまでくるとシステムでのバージョンが新しくなってしまう。
というか私の場合新しくなってしまった。

プロジェクト作成ごとの修正

$ rails new sample --skip-bundle

この--skip-bundleがないとbundle installが一緒に走ってしまう。

この後に
$ bundle install --path vendor/bundle
--path vendor/bundle このオプションをつけるとrailsアプリのルートディレクトリにインストールする。
つまり独立性を保ってくれる。

つけないと次のプロジェクトrails newをした時に,
またYou have already activated rake xx.x.x,
but your Gemfile requires rake xx.x.x.が出てくる。

一度このコマンドをすれば、Bundlerはインストール先を指定するので次回以降は、
bundle installのみで大丈夫。

一時的にbundle execやbin/を省くなら。

”export PATH=$PWD/bin:$PATH”
ターミナル上でこれをやると、ターミナルを閉じるまで省ける。
ただターミナルを再起動した時は再びexport PATH=$PWD/bin:$PATH

どうしても気になったので、自分なりに調べたので、
備忘録として残しておく。

他の解決作も参考 

http://qiita.com/ARTS_papa/items/b180176f3efd910b57d5
http://www.papa-programing.jp