ExecJS和找不到JavaScript运行时

416
我正在尝试使用Mongoid / Devise Rails 3.1模板MongoidDevise),但是我一直收到一个错误,指出ExecJS无法找到JavaScript运行时。当我没有安装任何内容时,这是公平的,但是我已经尝试安装Node.jsMustangRuby Racer,但是没有任何作用。
我找不到JavaScript运行时。请参见sstephenson/ExecJS(GitHub)以获取可用运行时列表(ExecJS :: RuntimeUnavailable )。
我需要做什么才能使其工作?

4
顺便提一句,我正在使用Ubuntu Karmic操作系统。 - srboisvert
你应该真正考虑更改答案。Node.js的答案远不如execjs/rubyracer。 - Sean Dunford
3
rubyracer存在其他问题。如果可以避免,Heroku不再建议在Gemfile中包含它。https://devcenter.heroku.com/articles/rails-asset-pipeline#therubyracer我认为,在Ubuntu上安装正确的JavaScript运行时是解决这个问题的正确答案。 - M. Scott Ford
18个回答

452

Ubuntu用户

我在Ubuntu 11.04上遇到了类似的问题。 安装Node.js解决了这个问题。

从Ubuntu 13.04 x64开始,你只需要运行:

sudo apt-get install nodejs

这将解决问题。


CentOS/RedHat 用户

sudo yum install nodejs

1
尝试过了,没有运气。我想知道是不是rvm冲突或者其他问题。别人提出的所有建议对我都没有起作用。 - srboisvert
78
"gem 'execjs'" 和 "gem 'therubyracer'" 是比这个更好的解决方案。 - dwaynemac
27
Heroku 现在强烈反对使用 therubyracer,因为它会占用大量内存。我按照这个回答在我的开发机上安装了 nodejs,并且从 gemfile 中移除了 therubyracer。参见 https://dev59.com/mmw05IYBdhLWcg3wszsl。 - Mark Berry
11
我不同意@dwaynemac的观点。我更希望运行库存在操作系统库中(与Mac和Windows默认情况下一样),而不是增加依赖列表中的另一个gem包。 - William Denniss
1
似乎therubyracer和execjs在heroku部署中存在问题,除非有其他修改我错过了。这是首选解决方案。 - Sturm
显示剩余11条评论

446

在你的gem文件中加入ExecJSRuby Racer,然后运行bundle install即可。

gem 'execjs'

gem 'therubyracer'

之后一切都应该很好。


6
这对我很有用,基于Rails 3.1rc4和Ubuntu 11.04(我第一次尝试使用Rails 3.1)。我在尝试生成一个脚手架时遇到了错误。仍然很遗憾,Rails 3.1开箱即损坏。 - wonderfulthunk
35
针对Rails 3.1 RC 6版本,您只需要指定gem 'therubyracer'即可。 - Amree
5
有没有办法在创建新应用程序时将这些宝石包含在默认的Gemfile中? - Richard Fawcett
2
这是比安装node.js更好的解决方案。如果您要部署到远程服务器或与其他开发人员共享应用程序,则让每个人都安装node.js比仅运行bundle install更加痛苦,而他们无论如何都会运行bundle install。 - jdkealy
20
由于内存使用问题,Heroku现在强烈不建议使用therubyracer。我在我的开发机器上安装了nodejs(https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager),并从我的gemfile中删除了therubyracer。参见https://dev59.com/mmw05IYBdhLWcg3wszsl。 - Mark Berry
显示剩余6条评论

78

在您的 Gem 文件中,写入

gem 'execjs'
gem 'therubyracer'

然后运行

bundle install

一切都对我来说都很好 :)


10
不需要添加“execjs”。 - miguelSantirso
是的,在Rails 3.2.1中,你只需要使用gem 'therubyracer'。 - manish nautiyal
感谢@manish nautiyal和@Peter Mortensen。这对我有用。 - Ravindra

48

我有一个类似的问题:我的 Rails 3.1 应用在 Windows 上运行良好,但在 Linux 上运行时与 OP 遇到了相同的错误。对我在两个平台上起作用的修复方法是将以下内容添加到我的 Gemfile 中:

gem 'therubyracer', :platforms => :ruby

诀窍在于知道:platforms => :ruby实际上意味着仅与“C Ruby (MRI)或Rubinius”一起使用此gem,但不包括Windows。

:platforms的其他可能值在bundler man页面中有描述。

FYI:Windows具有内置的JavaScript引擎,execjs可以定位。 在Linux上没有内置的引擎,尽管有几个可用于安装。 therubyracer是其中之一。 其他在execjsREADME.md中列出。


谢谢,这个对我在Ubuntu Oneiric上使用rvm安装的ruby 1.9.3和Rails 3.2.1进行了修复。 - Yashima
我在安装了node.js的CentOS服务器上遇到了错误。这个方法帮助我解决了问题。谢谢! - ncherro
1
bundler gemfile 的新手册:https://bundler.io/v2.2/man/gemfile.5.html#PLATFORMS - Luke Abel

37

将以下的gem添加到我的Gemfile中解决了这个问题:

gem 'therubyracer'

然后打包您的新依赖项:

$ bundle install

也要在Gemfile中添加gem 'execjs'。 - Bijendra
6
现在,Rails已经包含了execjs。它只在发布候选版本期间是必需的。 - JDutil

17

另一种方法是只打包不包含你没有的 gem 组。

因此,执行以下操作:

bundle install --without assets

您无需修改Gemfile,当然前提是您不会执行资产链操作——这通常适用于非开发环境。Bundle将在.bundle/config文件中记住您的“--without”设置。


最佳答案。适用于Rails版本3.2.3。 - Frantz Romain
1
这太棒了,而且修复起来很简单。Heroku网站上说不再需要RubyRacer(使用Cedar堆栈),所以我对为什么我的程序突然在本地无法运行感到困惑。这个方法解决了问题。 - Mike Blyth

8
在您的 gem 文件中添加以下宝石:
gem 'therubyracer'
gem 'execjs'

并运行

bundle install

你已经完成了 :)

7

针对亚马逊 Linux(AMI):

sudo yum install nodejs npm --enablerepo=epel

2
谢谢,这应该是在更高的水平上。 - damuz91
1
这一点对于使Capistrano在AWS标准Linux发行版上部署必不可少。 - jjk

6

我曾遇到过类似的错误,但只在我的测试服务器上出现,而在生产环境中则没有。两个环境都已经安装了nodejs。

通过输入以下命令:

which node

我发现在生产环境中,node命令位于:/usr/bin/node。但是在表演环境中是:/usr/local/bin/node。
在表演环境中创建符号链接,例如:
sudo ln -s /usr/local/bin/node /usr/bin/node

应用程序随后在暂存区中运行。
没有麻烦,也没有问题。

非常好用!建议:我需要为 nodejs 创建符号链接。 - Rafael Gomes Francisco
BOOM。在2021年仍然是一个很好的答案。赞。在我的情况下,我不得不为NVM创建符号链接,但是过程是相同的。 - Matt West

4

我通过nvm安装了node,在使用Capistrano部署时遇到了问题。由于Capistrano是非交互式运行的,因此它没有自动加载nvm。

要解决此问题,只需将nvm添加到~/.bashrc文件顶部即可。文件将类似于以下内容:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

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