在生产服务器上运行Rake任务失败,原因是ExecJS。

4

我有一个安装在RHEL 6机器上的Rails 4应用程序。

生产环境使用Passenger和Apache2。

最近我一直在尝试使用Whenever Gem和Cron将Rake任务整合到生产环境中作为定时任务。

每当我尝试在生产环境中运行其中一个Rake任务时,都会出现以下错误:

rake aborted!
ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

需要提及的是NodeJS已安装在机器上,我可以预编译资产等操作。具体而言,命令node --version将产生:v0.10.31

以下是我的堆栈跟踪:

  rake aborted!
    ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/execjs-2.2.1/lib/execjs/runtimes.rb:51:in `autodetect'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/execjs-2.2.1/lib/execjs.rb:5:in `<module:ExecJS>'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/execjs-2.2.1/lib/execjs.rb:4:in `<top (required)>'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.4/lib/active_support/dependencies.rb:229:in `require'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.4/lib/active_support/dependencies.rb:229:in `block in require'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.4/lib/active_support/dependencies.rb:214:in `load_dependency'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.4/lib/active_support/dependencies.rb:229:in `require'
    /var/www/eng_performance/shared/bundle/ruby/2.0.0/gems/uglifier-2.5.3/lib/uglifier.rb:3:in `<top (required)>'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler/runtime.rb:76:in `require'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler/runtime.rb:72:in `each'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler/runtime.rb:72:in `block in require'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler/runtime.rb:61:in `each'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler/runtime.rb:61:in `require'
    /home/deploy/.rvm/gems/ruby-2.0.0-p481/gems/bundler-1.7.2/lib/bundler.rb:133:in `require'
    /var/www/eng_performance/releases/20141014084554/config/application.rb:7:in `<top (required)>'
    /var/www/eng_performance/releases/20141014084554/Rakefile:4:in `require'
    /var/www/eng_performance/releases/20141014084554/Rakefile:4:in `<top (required)>'
    (See full trace by running task with --trace)

注意: 我已经从源代码编译安装了NodeJS,因为当我尝试从仓库安装时,遇到了一个我不知道如何解决的错误:

Packages skipped because of dependency problems:
    c-ares19-1.9.1-5.el6.3.x86_64 from epel
    http-parser-2.0-4.20121128gitcd01361.el6.x86_64 from epel
    1:libuv-0.10.28-1.el6.x86_64 from epel
    nodejs-0.10.30-1.el6.x86_64 from epel
    1:v8-3.14.5.10-11.el6.x86_64 from epel

1
请检查您的Gemfile文件中是否取消注释了gem 'therubyracer' - R Milushev
@RMilushev,感谢您的回复。 据我所知,由于性能问题,不建议使用therubyracer。 我找到了多个类似于这样的线程:[rubyracer vs nodejs](https://dev59.com/MGUq5IYBdhLWcg3wC8Px)。 您是否了解这些问题?在此宝石的某些新版本中是否有任何更改? - cyber101
1
我在我的生产Debian Linux服务器上使用nodejs的经验不佳。它必须以非常特殊的方式安装,因此我们决定依赖于therubyracer gem。我认为没有性能问题,因为它是一个V8 js机器包装器,没有更多或更少。 - R Milushev
1个回答

5

嗯,终于,我成功解决了这个问题 :)

事实证明,node.js的安装没有什么问题,但是引用它的方式有问题。

我不知道为什么会发生这种改变,但是遵循这篇文章解决了问题 - 即通过添加符号链接 ln -s /usr/local/bin/node /usr/bin/node

注意:我非常确定符号链接并不是最佳实践。如果有人能提出另一个想法-我很想听听。

希望这是我使用node.js时遇到的最后一个错误。 如果出现类似于此类的其他错误,therubyracer将提供出色的备份解决方案。


有人能否评论一下,为什么我们在生产环境中需要JS环境,当我们可以使用Web服务器来提供预编译的内容,更不用说一个Rake任务,它可能根本不需要任何JS。 - mlt

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