在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
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:Module
在libv8-3.11.8.13
中没有 include_path
的方法,但是在libv8-3.3.10.2
所以这就是卸载所有 libv8
版本,然后重新安装therubyracer
。 由于没有 include_path
方法的libv8
所有版本都被完全删除,并且在重新安装therubyracer
时重新安装了include
path的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应用程序实际上并不需要therubyracer
或libv8
。 从我的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
有同样的错误,这对我工作:
-
从控制台:
gem uninstall libv8
-
在您的Gemfile中,添加以下内容:
gem 'therubyracer', :platforms => :ruby, :require => 'v8' gem 'libv8', '~> 3.11.8' # Update version number as needed
-
从控制台:
bundle install
如果您正在升级therubyracer gem的过程中,那么您可能还想运行bundle update therubyracer
。 (考虑指定一个版本号)
这是在Mac 10.6(雪豹)。