めもめも のーと

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

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(JavaScriptRubyで実行するための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の環境構築はバージョンの組み合わせでハマることが多いですね。 この記事もすでに同じ内容を書かれている方がいらっしゃいますが、 誰かの一助になれば幸いです。(_ _)

参考にさせて頂いたサイト

therubyracer 0.11.0 問題まとめ - 自称すーじー。

libv8とtherubyracer入らない問題にわたしもハマったメモ - 青いの