Rails:找不到JavaScript运行时。请参阅https://github.com/sstephenson/execjs以获取可用运行时列表。(ExecJS :: RuntimeUnavailable)

78
自 Dreamhost 几周前升级他们的服务器以来,我的网站就一直无法正常运行。我一直在努力修复它,取得了一些进展,但现在遇到了一个希望是最后问题的困境。
我使用 Rails 3.1.1 和 Ruby 1.8.7,在 PhusionPassenger 中出现“无法启动 Ruby(Rack)应用程序”错误。它指出“找不到 JavaScript 运行时。请参见https://github.com/sstephenson/execjs查看可用运行时列表。(ExecJS::RuntimeUnavailable)”。在 Dreamhost 的 wiki 上搜索这个问题时,建议安装“therubyracer” gem。
因此,我按照建议更新了我的 gemfile,如下所示:

gem 'therubyracer','~> 0.9.9'

编辑:我还尝试添加以下内容到文件中:

gem 'therubyracer',:platforms => :ruby

但它没有起作用。
然后,在我的 MacBook 上运行“bundle install”时没有任何问题。但是,当我运行“cap deploy”将其放在 Dreamhost 上时,它失败了;当它尝试安装 therubyracer 依赖项 libv8 时,我看到了一个错误。
有人知道如何正确安装它或其他有效的解决方案吗?
可以根据需要提供任何其他信息。
终端的完整错误反馈:
执行 "cd /home/futureproof/abunchofletters.co.uk/releases/20111118003703 && bundle install --gemfile /home/futureproof/abunchofletters.co.uk/releases/20111118003703/Gemfile --path /home/futureproof/.gems/bundle --deployment --quiet --without development test" servers: ["abunchofletters.co.uk"] [abunchofletters.co.uk] 执行命令 ** [out :: abunchofletters.co.uk] 很不幸,发生了致命错误。 请将此错误报告给Bundler问题跟踪器https://github.com/carlhuda/bundler/issues以便我们修复它。 谢谢! ** [out :: abunchofletters.co.uk] /usr/lib/ruby/1.8/rubygems/installer.rb:483:in build_extensions': ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError) ** [out :: abunchofletters.co.uk] ** [out :: abunchofletters.co.uk] /usr/bin/ruby1.8 extconf.rb ** [out :: abunchofletters.co.uk] *** extconf.rb failed *** ** [out :: abunchofletters.co.uk] Could not create Makefile due to some reason, probably lack of ** [out :: abunchofletters.co.uk] necessary libraries and/or headers. Check the mkmf.log file for more ** [out :: abunchofletters.co.uk] details. You may need configuration options. ** [out :: abunchofletters.co.uk] ** [out :: abunchofletters.co.uk] 提供的配置选项: ** [out :: abunchofletters.co.uk] --with-opt-dir ** [out :: abunchofletters.co.uk] --without-opt-dir ** [out :: abunchofletters.co.uk] --with-opt-include ** [out :: abunchofletters.co.uk] --without-opt-include=${opt-dir}/include ** [out :: abunchofletters.co.uk] --with-opt-lib ** [out :: abunchofletters.co.uk] --without-opt-lib=${opt-dir}/lib ** [out :: abunchofletters.co.uk] --with-make-prog ** [out :: abunchofletters.co.uk] --without-make-prog ** [out :: abunchofletters.co.uk] --srcdir=. ** [out :: abunchofletters.co.uk] --curdir ** [out :: abunchofletters.co.uk] --ruby=/usr/bin/ruby1.8 ** [out :: abunchofletters.co.uk] extconf.rb:13: uninitialized constant Gem (NameError) ** [out :: abunchofletters.co.uk] Checking for Python... ** [out :: abunchofletters.co.uk] ** [out :: abunchofletters.co.uk] Gem files will remain installed in /home/futureproof/.gems/bundle/ruby/1.8/gems/libv8-3.3.10.4 for inspection. ** [out :: abunchofletters.co.uk] Results logged to /home/futureproof/.gems/bundle/ruby/1.8/gems/libv8-3.3.10.4/ext/libv8/gem_make.out ** [out :: abunchofletters.co.uk] from /usr/lib/ruby/1.8/rubygems/installer.rb:446:ineach' ** [out :: abunchofletters.co.uk] from /usr/lib/ruby/1.8/rubygems/installer.rb:446:in build_extensions' ** [out :: abunchofletters.co.uk] from /usr/lib/ruby/1.8/rubygems/installer.rb:198:ininstall' ** [out :: abunchofletters.co.uk] from /home/futureproof/.gems/gems/bundler-1.1.rc/lib/bundler/source.rb:90:in install' ** [out :: abunchofletters.co.uk] from /home/futureproof/.gems/gems/bundler-1.1
10个回答

157

如果你正在使用Ubuntu,安装nodejs

sudo apt-get install nodejs

谢谢,来自哥伦比亚的问候。 - chenio
1
与其说感谢,我觉得很奇怪的是,在Ubuntu 14.04安装nodejs会导致成功的结果,而libv8-dev则不会。 - Jerome
这个解决方案也适用于macOS brew install node - Darkaico

38

libv8 是一个操作系统库;你需要安装正确的Linux系统库。如果你正在运行Ubuntu,应该是

sudo apt-get install libv8-dev

或者,您可以安装node.js,它作为Debian / Ubuntu包在各种发行版中提供,例如http://ppa.launchpad.net/chris-lea/node.js/ubuntu

如果您在Heroku上部署,就不必管理gem的操作系统或组件,这可能会为您节省很多麻烦。


1
我在一个共享服务器上没有sudo权限,但我设法安装了node.js来解决这个问题。不过现在我正在考虑认真尝试Heroku,因为使用资产管道让Rails 3网站工作似乎永无止境地出现问题。 - Rich
1
@Rich,Heroku绝对是最好的选择。作为开发人员,我发现我不想处理所有必须保持服务器运行、安全、安装补丁、备份等的事情。这最多是耗时的,最糟糕的情况下非常脆弱。让专家来做他们擅长的事情吧。 - Wolfram Arnold

11

我在Dreamhost上使用这个宝石来处理Rails 3.1的资源管道。

group :assets do
  gem 'execjs'
  gem 'therubyracer', :platforms => :ruby
  gem 'johnson'
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

使用therubyracer作为预编译器,使用johnson作为运行时环境。

在Dreamhost托管的两个Rails 3.1应用中,这对我有效。


感谢您的评论。您是在共享的Dreamhost服务器还是VPS上?您正在运行哪个版本的Ruby? - Rich
1
2021年,Rails 4.2.10版本。这个答案解决了我在Dreamhost共享服务器上的问题。 - drmwndr

11

你只需要获取libv8,对于使用Brew的操作系统,只需执行以下操作:

brew install v8

6

我是在Dreamhost共享服务器上。

我安装了Node.js,但没有使用root/sudo权限。在服务器上:

#download node js (check last version from web)
$ wget http://nodejs.org/dist/v0.8.16/node-v0.8.16-linux-x86.tar.gz
#untar
$ tar xzf node-v0.8.16-linux-x86.tar.gz

最后将其路径添加到deploy.rb中,添加以下行(在此情况下添加了其他一些路径):
default_environment["PATH"] = ":/home/myUser/soft/node-v0.8.16-linux-x86/bin:/home/myUser/.gems/bin:/usr/lib/ruby/gems/1.8/bin/:$PATH"

你完成了


在我的情况下,要添加到 deploy.rb 的 PATH 简单地是:default_environment["PATH"] = "$HOME/local/bin:$PATH" - Sunny
我正在尝试您的解决方案,但是我找不到deploy.rb文件。我该如何找到它?我必须在某个地方创建它吗? - Paco Abato

2

我刚刚看了一个关于这个的演示文稿。

到目前为止,我一直在使用rubytheracer。 显然它不是很好。 而且它很大。

但是你可以使用任何JavaScript运行时。

另外两个推荐的是execjsnode.js(现在非常流行)。

确保gem install所选的gem,然后为您的应用程序运行bundle installbundle update

另一个注意事项是您还应该切换到1.9.2。
安装RVM(bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)),这样您就可以并排拥有1.8.7和1.9.2。


1

我在我的Win7开发机上遇到了同样的问题。看起来安装https://github.com/hiranpeiris/therubyracer_for_windows并将gem 'therubyracer'添加到Gemfile可以解决问题。

之前:

$ rails generate
c:/Ruby193/lib/ruby/gems/1.9.1/gems/execjs-1.4.0/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)
    from c:/Ruby193/lib/ruby/gems/1.9.1/gems/execjs-1.4.0/lib/execjs.rb:5:in `<module:ExecJS>'
(...)

这基本上意味着Rails需要rubyracerlibv8
之后:
$ rails generate
    SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
    This poses a security threat. It is strongly recommended that you
    provide a secret to prevent exploits that may be possible from crafted
    cookies. This will not be supported in future versions of Rack, and
    future versions will even invalidate your existing user cookies.

    Called from: c:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_dispatch/middleware/session/abstract_store.rb:28:in `initialize'.

Usage: rails generate GENERATOR [args] [options]
(...)

1
我建议安装Nodejs,这对我很有效。
只需打开终端并输入以下命令: sudo apt-get install node.js 输入密码...每当需要确认时,按下“Y”。希望这能帮到你!

1
正如我在沃尔夫拉姆的回答中所说,我在共享服务器上没有sudo权限,但对于那些有sudo权限的人来说,这可能非常有效。 - Rich

0
在Gemfile中添加以下gem,并尝试使用bundle install安装:
gem "therubyracer", "~> 0.10.2"

0

这个错误是由于缺少Javascript运行环境引起的,比如Nodejs。可能是你没有选择它或者没有安装。

使用以下命令检查是否已经安装了nodejs:

nvm list
nvm use <version> //to use it (i.e nvm use 14)

如果未安装,请使用。
sudo apt-get install nodejs 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接