therubyracerとlibv8のバージョン組み合わせが悪くてエラーになった件
Rails4.1系のプロジェクトを作ってみようと思ったら、therubyracerとlibv8のバージョンによる組み合わせが悪くてハマったので、メモとして残します。
環境
Ubuntu 12.04.5 LTS ruby 2.0.0p353 (rbenvでインストール) Rails4.1.6 (執筆時点で4.1系最新) $ ruby -rubygems -e 'puts Gem::Platform.new(RUBY_PLATFORM)' x86-linux
結論
先に結論を書きます。 Gemfileに以下のようにtherubyracerとlibv8のバージョンを指定してbundle installすればよいようです。
gem 'therubyracer', '= 0.10.2', platforms: :ruby gem 'libv8', '= 3.3.10.4'
環境によってどのバージョンの組み合わせを入れるかがポイントだそうです。 ここに記載されています。
installing with native extensions stall · Issue #62 · cowboyd/libv8 · GitHub
今回の環境はx86-linuxだったので、↑の通り指定したら、うまくいきました。
解決までの道のり
gemはbundlerで管理するので、Gemfileを作り、rails4.1の最新を指定します。
$ bundle init
Gemfile
source "https://rubygems.org" gem "rails", '~> 4.1.0'
bundle install します。
$ bundle install --path=vendor/bundle
無事インストールされたので、プロジェクトを作ってみます。
$ cd lucy # 今回のプロジェクトディレクトリですw $ bundle exec rails new .
※Gemfileのコンフリクトが起こりましたが、Railsのgemの指定の差異だったので、とりあえずYとして上書きしました。 そして、エラーになりました。
create vendor/assets/javascripts create vendor/assets/javascripts/.keep create vendor/assets/stylesheets create vendor/assets/stylesheets/.keep run bundle install Fetching gem metadata from https://rubygems.org/.......... Resolving dependencies... Bundler could not find compatible versions for gem "sprockets": In snapshot (Gemfile.lock): sprockets (2.12.2) In Gemfile: sass-rails (~> 4.0.3) ruby depends on sprockets (<= 2.11.0, ~> 2.8) ruby Running `bundle update` will rebuild your snapshot from scratch, using only the gems in your Gemfile, which may resolve the conflict. run bundle exec spring binstub --all bundler: command not found: spring Install missing gem executables with `bundle install`
bundle update を実行し、Gemfile.lockを無視して再度インストールしてみます。
すると今度はうまくいきました。 しかし起動するとエラーが。。
$ bundle exec rails server /home/app/projects/peanats/lucy/vendor/bundle/ruby/2.0.0/gems/execjs-2.2.1/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
execjs(JavaScriptをRubyで実行するためのgem)がランタイムが無い旨のエラーをはいています。
一般的にはtherubyracerをインストールすれば良いようなので、 Gemfileに追記して、再度bundle install します。
Gemfile
# gem 'therubyracer', platforms: :ruby #<= コメントアウトを外す
エラーになりました。
$ bundle install ・・・ Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. ・・・ An error occurred while installing libv8 (3.16.14.7), and Bundler cannot continue. Make sure that `gem install libv8 -v '3.16.14.7'` succeeds before bundling.
色々調べた結果、結論の部分に書いた通り環境によるバージョンの組み合わせが重要だという事が 分かったので、バージョンを指定して実行したら、うまくいきました。
$ bundle exec rails s => Booting WEBrick => Rails 4.1.6 application starting in development on http://0.0.0.0:3000 => Run `rails server -h` for more startup options => Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option) => Ctrl-C to shutdown server
Railsの環境構築はバージョンの組み合わせでハマることが多いですね。 この記事もすでに同じ内容を書かれている方がいらっしゃいますが、 誰かの一助になれば幸いです。(_ _)