在Mac OS X Lion上,"gem install therubyracer"失败

Dav*_* J. 70 ruby rubygems v8

我很感激gem install therubyracer上班的帮助.这是错误:

$ gem install therubyracer
Building native extensions.  This could take a while...
ERROR:  Error installing therubyracer:
    ERROR: Failed to build gem native extension.

        /Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for main() in -lobjc... yes
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
    --with-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
    --with-objclib
    --without-objclib
extconf.rb:15:in `<main>': undefined method `include_path' for Libv8:Module (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

以下是我在错误之前运行的一些值得注意的步骤.他们工作得很好:

$ gem install libv8
$ brew install v8
Run Code Online (Sandbox Code Playgroud)

我的环境是:

  • Mac OS X Lion 10.7.4
  • ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin11.4.0](通过rvm)
  • V8版本3.9.24(通过自制程序)

Dav*_* J. 106

这对我有用:

$ gem uninstall libv8
$ gem install therubyracer
Run Code Online (Sandbox Code Playgroud)

(非常感谢http://www.ruby-forum.com/topic/4306127)


Ken*_*ika 43

gem uninstall libv8
brew install v8
gem install therubyracer
Run Code Online (Sandbox Code Playgroud)


Mar*_*yne 40

但是,为什么会发生这种情况,你问?为什么卸载libv8和重新安装会therubyracer解决问题?

答案位于错误消息的底部(来自orig post).忽略那些东西

probably lack of necessary libraries and/or headers
Run Code Online (Sandbox Code Playgroud)

编写该错误消息的人是错误的假设.在底部,您可以看到Ruby对此有何评论:

undefined method `include_path' for Libv8:Module
Run Code Online (Sandbox Code Playgroud)

就我而言,我试图安装therubyracer-0.9.8使用bundle install,出于某种原因,有人试图用我的副本libv8-3.11.8.13,其中已经安装在某些时候,可能是因为其他一些宝石的依赖.

我不知道为什么它试图使用更新的版本,因为therubyracer.gemspec包含s.add_dependency "libv8", "~> 3.3.10".我Gemfile.lock说要用libv8 (3.3.10.2).但唉,这确实是发生了什么.

而这是真的,Libv8:Module不能有方法include_pathlibv8-3.11.8.13,但它确实libv8-3.3.10.2

这就是卸载所有版本libv8然后重新安装的原因therubyracer.因为所有的版本libv8没有方法include_path完全去除,libv8确实有方法include,当你重新安装的路径重新安装therubyracer.

  • 感谢您抽出宝贵时间写下解释原因 (2认同)

Abe*_*llo 15

考虑到没有,如果上面100%对我有用,我想我会发布做什么(作为rails项目的一部分):

gem uninstall libv8
bundle update therubyracer
Run Code Online (Sandbox Code Playgroud)

这确保我获得了最新therubyracer版本,也是最新版本libV8,并且似乎解决了我遇到的多个问题,从缺少libv8.a文件到未定义的方法.


szp*_*pas 12

最后我使用了therubyracer 0.11.0beta5作为解决方案.

使用therubyracer(0.11.0beta5)

在Gemfile上添加以下内容

gem 'therubyracer', '~> 0.11.0beta5'
group :libv8 do
  gem 'libv8', "~> 3.11.8"
end
Run Code Online (Sandbox Code Playgroud)

然后 bundle install

Mac OSX 10.8 Moutain Lion


cwd*_*cwd 10

如果你需要0.11.3而且它失败了为Mac OS X 10.9拍摄...

gem uninstall libv8
brew install v8
gem install libv8 -- --with-system-v8
gem install therubyracer -v '0.11.3' -- --with-system-v8
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此问题.

你可能不需要-- --with-system-v8在最后一行,但我这样做只是为了安全,因为我看到它Fetching: libv8-3.11.8.17-x86_64-darwin-13.gem (1%)在我运行命令时开始做...

无论如何,当所有其他事情都没有时,它对我有用.


Pau*_*nti 7

对于任何试图自己升级的时候在Mac OSX 10.8山狮遇到此问题的Gemfilegem 'therubyracer', '0.11.0',只是系统升级libv8宝石为我工作(无需任何其他宝石的卸载):

$ gem update libv8
$ bundle install
Run Code Online (Sandbox Code Playgroud)

编辑

如果您使用Travis-CI(或其他服务器上的其他CI工具,我假设),您还需要明确地将libv8gem 添加到您的Gemfile中:

的Gemfile

gem 'libv8', '3.11.8.3'
Run Code Online (Sandbox Code Playgroud)

然后bundle install像往常一样.请注意,安装libv8可能需要花费大量时间,而且我注意到它可能最终导致超过Travis CI的超时限制,从而导致构建失败.您可以稍微缓解这一点,不包括构建中的开发环境gem:

.travis.yml

# ...
bundler_args: --binstubs=./bundler_stubs --without development
Run Code Online (Sandbox Code Playgroud)

更新

是的,几乎所有我的Travis构建超时并因此而失败.如果有人知道解决这个问题的方法(我希望"降级therubyracer"是最后的手段),请发表评论!

更新2

这可能不适用于所有应用程序,但似乎我的Rails 3.2.9应用程序实际上并不需要therubyracerlibv8毕竟.从我的Gemfile中删除那些宝石后,我确认我的规格已经通过,再次推送到Travis并且它已成功构建.所以,我想摆脱那些宝石(如果你不确定你真的需要它们)至少值得一试.

更新3

感谢Paul Annesley确认如果您使用的是Mac OS X 10.8 Mountain Lion,那么您根本不需要 therubyracergem,因为操作系统已经捆绑了Apple JavaScriptCore,它是自己的Javascript跑步者.在最初答案的时候,我在Snow Leopard上,因此需要它.