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

我希望得到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) 

以下是我在错误之前执行的一些重要步骤。 他们工作得很好:

 $ gem install libv8 $ brew install v8 

我的环境是:

  • Mac OS X Lion 10.7.4
  • ruby1.9.3p194(2012-04-20修订版35410)[x86_64-darwin11.4.0](通过rvm)
  • V8版本3.9.24(通过自制软件)

这对我工作:

 $ gem uninstall libv8 $ gem install therubyracer 

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

 gem uninstall libv8 brew install v8 gem install therubyracer 

但是,你为什么会这样呢? 为什么卸载libv8并重新安装therubyracer解决问题?

答案是在错误信息的底部(来自orig post)。 忽略有关的东西

 probably lack of necessary libraries and/or headers 

谁写这个错误信息是不正确的假设。 在最底层,你可以看到Ruby对此有何评论:

 undefined method `include_path' for Libv8:Module 

在我的情况下,我试图安装therubyracer-0.9.8 bundle install ,出于某种原因,它试图使用我的libv8-3.11.8.13 ,它已经安装在某个时候的副本,可能作为依赖一些其他的gem。

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

Libv8:Modulelibv8-3.11.8.13没有 include_path的方法,但是在libv8-3.3.10.2

所以这就是卸载所有 libv8版本,然后重新安装therubyracer 。 由于没有 include_path方法的libv8所有版本都被完全删除,并且在重新安装therubyracer时重新安装了includepath的therubyracer

考虑到以上都不是,如果上述工作对我来说100%,我想我会张贴什么(作为一个铁路项目的一部分):

 gem uninstall libv8 bundle update therubyracer 

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

最后我用therubyracer 0.11.0beta5作为解决scheme。

使用therubyracer(0.11.0beta5)

在Gemfile中添加以下内容

 gem 'therubyracer', '~> 0.11.0beta5' group :libv8 do gem 'libv8', "~> 3.11.8" end 

然后bundle install

Mac OSX 10.8 Moutain Lion

如果你需要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 

看到这个问题的更多细节。

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

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

对于在Mac OSX 10.8 Mountain Lion上遇到这个问题的用户,当试图用gem 'therubyracer', '0.11.0'升级他们的Gemfile时,只需升级系统libv8 gem就可以工作(不需要卸载任何其他gem):

 $ gem update libv8 $ bundle install 

编辑

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

的Gemfile

 gem 'libv8', '3.11.8.3' 

然后像往常一样bundle install 。 请注意, libv8可能需要大量的时间来安装,我注意到它可能会导致超过Travis CI的超时限制 ,导致您的构build失败。 你可以减轻这一点,不包括你的构build中的开发环境gem:

.travis.yml

 # ... bundler_args: --binstubs=./bundler_stubs --without development 

更新

是的,几乎所有我的特拉维斯build立超时,并因此失败。 如果有人知道解决这个问题的办法(我希望“降级therubyracer ”是最后的手段),请发表评论!

更新2

这可能不适用于所有应用程序,但似乎我的Rails 3.2.9应用程序实际上并不需要therubyracerlibv8 。 从我的Gemfile中删除这些gem后,我确认了我的规格通过,再次推到Travis,并成功build成。 所以,我想摆脱这些gem(如果你不确定是否真的需要它们)至less值得一试。

更新3

感谢Paul Annesley的确认,如果你使用的是Mac OS X 10.8 Mountain Lion,那么你就不需要使用therubyracer gem了,因为操作系统已经捆绑了自己的Javascript runner的Apple JavaScriptCore。 在原来的答案时,我在雪豹,因此需要它。

对我来说,删除Gemfile.lock文件和运行bundle install工作是神奇的。

OSX 10.8.2,ruby1.9.3p125

以上都没有为我工作…我厌倦了试图find适合我的环境的正确的gem,所以我只是软链接到g ++目标这个东西是失踪:

 sudo ln -s `which g++` /usr/bin/g++-4.2 

对远程部署没有帮助,而是在工作站上完成工作。

我有类似的问题,但也抱怨没有findg ++ – 4.2。 我确实安装了XCode命令行工具,但是它正在寻找/usr/bin/g++-4.2,我有g ++(这是一个指向llvm-g ++ – 4.2的符号链接)。 无论如何,我只是创build了一个符号链接到g ++,并尝试再次安装包…它的工作!

$ cd /usr/bin

$ sudo ln -s g++ g++-4.2

有同样的错误,这对我工作:

  1. 从控制台: gem uninstall libv8

  2. 在您的Gemfile中,添加以下内容:

     gem 'therubyracer', :platforms => :ruby, :require => 'v8' gem 'libv8', '~> 3.11.8' # Update version number as needed 
  3. 从控制台: bundle install

如果您正在升级therubyracer gem的过程中,那么您可能还想运行bundle update therubyracer 。 (考虑指定一个版本号)

这是在Mac 10.6(雪豹)。