在Heroku中部署Rails 3.1项目时出现问题:无法findJavaScript运行时

我在部署一个rails 3.1testing版项目到heroku时遇到了麻烦。 问题发生在数据库迁移步骤。 当我跑时:

heroku rake db:migrate 

我收到错误消息:

 >耙中止! 

 >找不到JavaScript运行时。 看到
 > https://github.com/sstephenson/execjs
 >获取可用运行时的列表。

 > / app / Rakefile:5 

 >(通过使用--trace运行任务来查看完整跟踪) 

 >(在/ app)

但是我可以在本地成功运行应用程序,并且我已经安装了nodejs。 任何想法为什么?

这里我的gem名单:

 abstract (1.0.0) actionmailer (3.1.0.beta1) actionpack (3.1.0.beta1, 3.0.7) activemodel (3.1.0.beta1, 3.0.7) activerecord (3.1.0.beta1) activeresource (3.1.0.beta1) activesupport (3.1.0.beta1, 3.0.7) ansi (1.2.5) arel (2.1.0) bcrypt-ruby (2.1.4) builder (3.0.0, 2.1.2) bundler (1.0.13) coffee-script (2.2.0) coffee-script-source (1.1.0) configuration (1.2.0) daemon_controller (0.2.6) erubis (2.7.0, 2.6.6) execjs (1.0.0, 0.3.3) fastthread (1.0.7) heroku (2.1.4) hike (1.0.0) i18n (0.6.0beta1, 0.5.0) jquery-rails (1.0.1) json (1.5.1) json_pure (1.5.1) launchy (0.4.0) mail (2.3.0) mime-types (1.16) minitest (1.6.0) multi_json (1.0.1) mysql (2.8.1) mysql2 (0.3.2) oauth (0.4.4) passenger (3.0.7) polyglot (0.3.1) rack (1.3.0.beta, 1.2.2) rack-cache (1.0.1) rack-mount (0.7.2, 0.6.14) rack-ssl (1.3.2) rack-test (0.6.0, 0.5.7) rails (3.1.0.beta1) railties (3.1.0.beta1) rake (0.8.7) rdoc (2.5.8) rest-client (1.6.1) rubygems-update (1.8.1) sass (3.1.1) simplegeo (0.5.1) sprockets (2.0.0.beta.2) sqlite3 (1.3.3) sqlite3-ruby (1.3.3) term-ansicolor (1.0.5) therubyracer-heroku (0.8.1.pre3) thor (0.14.6) tilt (1.3) treetop (1.4.9) turn (0.8.2) tzinfo (0.3.27) uglifier (0.5.1) 

你需要一个Rails 3.1的JavaScript引擎(heroku没有),看来和Heroku一起工作的JavaScript引擎是heroku的rubyracer 。

Rails使用execjs来执行JavaScript,而execjs则支持7个JavaScript引擎。 Node.js是一个,rubyracer是一个。

Gerred Dillon也有类似的问题,并写下来。 在注释部分,有人提出了一个关于使这只是一个生产改变,因为你已经有nodejs作为你的本地JavaScript引擎。 所以相关的代码是:

 group :production do gem 'therubyracer-heroku', '0.8.1.pre3' end 

更新: Heroku有一个新的堆栈,称为Cedar ,他们推荐使用Rails 3.1.0。 (运行heroku stack来查看你的应用程序在哪个堆栈上。)Heroku还有一个关于升级到Rails 3.1.0 rc5的文档。 他们build议不要使用'therubyracer-heroku'gem,因为它不需要rc5。

如果您是从较旧的rc进行升级,请确保更新您的config / application.rb文件,并运行以下命令:

 heroku config:add PATH=vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin:bin 

显然,这是设置在新的应用程序,但现有的应用程序没有设置此path。

您不一定需要JavaScript运行时才能将Rails 3.1testing版部署到heroku。

只有在部署时(例如,通过uglifier gem)缩小JavaScript,或者使用coffee-script,才需要JavaScript运行时。

它看起来像这个JavaScript运行时依赖将不会在3.1最终版本。

如果你不介意不缩小你的javascript(也是如果你不使用咖啡脚本),那么你可以注释掉Gemfile中coffee-script,uglifier和execjs gems,并注释掉config.assets。你的production.rb中的 js_compressor ,你应该很好去。

截至这篇文章的date,你仍然需要指定

gem'therubyracer-heroku','0.8.1.pre3'

在你的gemfile中,以便成功地部署一个Rails 3.1应用程序到Heroku的Cedar平台。

尽pipe可以将Node应用程序部署到Cedar平台,但在部署Rails应用程序时,Node本身并不存在于Cedar堆栈中,因此您必须绑定自己的JavaScript运行时。

目前。

我知道Rails方面的人正在努力消除对js运行时的依赖, http://yehudakatz.com/2011/06/14/what-the-hell-is-happening-to-rails/而且我相信Heroku也在研究如何使Rails 3.1部署正常工作。

在我的情况下,它成功上传到Heroku并访问页面后发生。

 ActionView::Template::Error (Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. 2012-01-09T08:21:19+00:00 app[web.1]: (in /app/app/assets/javascripts/page.js.coffee)): 

设置path使用'herokuconfiguration:添加PATH等等'没有帮助。

“耙资产:预编译”刚解决了。

希望它能帮助像我这样的人!