Rails4.1にてBundler could not find compatible versions for gem "sprockets" が出る件
Rails4.1.8(2014年11月24日現在で安定版最新)のプロジェクトを作る際に下記のエラーが出たのでメモ。
バージョン
ruby 2.1.5p273 rails 4.1.8
Gemfile
source 'https://rubygems.org' gem 'rails', '~>4.1.8'
Gemfileがあるディレクトリに移動して、rails new する。
$ cd /home/app/rails_project/ $ bundle exec rails new .
※Gemのインストールが始まりますが、Gemfileのコンフリクトが起こりました。 今回はrailsのバージョン指定方法の差異だけだったので後で直すことにして、Gemfileを上書きしました。
そしてgemをインストールしている最中に、以下のエラーがでました。
Fetching gem metadata from https://rubygems.org/........... Resolving dependencies... Bundler could not find compatible versions for gem "sprockets": In Gemfile: sass-rails (~> 4.0.3) ruby depends on sprockets (<= 2.11.0, ~> 2.8) ruby rails (= 4.1.8) ruby depends on sprockets-rails (~> 2.0) ruby depends on sprockets (2.12.3) run bundle exec spring binstub --all bundler: command not found: spring Install missing gem executables with `bundle install`
sass-railsとsprockets-railsで、依存関係にあるsprocketsのバージョンが異なるためにエラーになりました。
そこで Gemfile.lockを削除またはリネームし、 vendorディレクトリ(gemのインストール先)とGemfileのみ残して、bundleをスキップするオプションをつけて以下を実行 しました。
$ bundle exec rails new . --skip-bundle
終わったら以下の通り、手動でもう一度bundle install します。 ※「もう一度」というのは、rails new をする前に一度bundle installを実行しているため。
$ bundle install --path=vendor/bundle/
無事終わったので、結局sprocketsのバージョンはどうなったか見てみました。
$ bundle exec gem list sprockets *** LOCAL GEMS *** sprockets (2.11.3) sprockets-rails (2.2.0)
sprockets (2.12.3) だと新しくてバージョン依存のエラーが出るみたいなので、2.11系が正解?みたいです。
最終的なGemfile.lockの一部はこちら。
GEM remote: https://rubygems.org/ ・・・ sprockets (2.11.3) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0)
まとめ
手順をまとめると、以下のようになりました。
$ mkdir rails_project $ cd rails_project $ rbenv local 2.1.5 $ bundle init
$ vim Gemfile source "https://rubygems.org" gem "rails", '~> 4.1.8'
$ bundle install --path=vendor/bundle $ bundle exec rails new . --skip-bundle GemfileのコンフリクトはYで上書き。
作られたGemfile.lockにはsprockets(2.12.3)となっているので、リネームか削除。
$ mv Gemfile.lock Gemfile.lock.bk
もう一度bundle install
$ bundle install --path=vendor/bundle
すると今度はsprocketsが2.11.3でインストールされ、Gemfile.lockにも2.11.3で書かれる。
一発でバシッと完了しないのでしょうか。。