めもめも のーと

ハマったこととか、覚えたこととか

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で書かれる。

一発でバシッと完了しないのでしょうか。。