问题:将Rails 3.1项目部署到Heroku时出现问题:找不到JavaScript运行环境

38

我在部署一个 Rails 3.1 beta 项目到 Heroku 的过程中遇到了问题。问题出现在数据库迁移步骤。当我运行下面的命令时:

heroku rake db:migrate

我收到了以下错误信息:

> rake aborted! 

> 找不到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)
4个回答

50
你需要为Rails 3.1使用JavaScript引擎(heroku没有提供),看起来适用于Heroku的JavaScript引擎是rubyracer for heroku
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。他们建议不再使用“therubyracer-heroku”宝石,因为在rc5中不再需要。

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

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

显然,这在新应用程序中设置了,但现有的应用程序没有设置此路径。


我刚刚尝试了这个,但是文件在Heroku上安装失败。谷歌搜索显示有很多类似的问题。 - providence
同时,可能需要更新config/initializers/session_store.rb中第3行的内容,例如MyApp :: Application.config.session_store:cookie_store,:key =>'_blahblahblah_session'。 - providence
我已经安装了这个 gem 并在 Gemfile 中使用。

Asset 模板引擎

gem 'sass' gem 'coffee-script' gem 'uglifier'gem 'jquery-rails' gem 'therubyracer-heroku','0.8.1.pre3',:platforms => :ruby

使用 unicorn 作为 Web 服务器

gem 'unicorn'

使用 Capistrano 部署

gem 'capistrano'

使用 debugger

gem 'ruby-debug19',:require => 'ruby-debug'

group :test do

美化测试输出

gem 'turn',:require => false end
- WYi
抱歉,我必须稍微重新格式化一下之前的评论。我已经安装了这个宝石并在Gemfile中使用: gem 'therubyracer-heroku','0.8.1.pre3',:platforms =>:ruby 但是它没有起作用。 - WYi
2
Heroku现在有一个带有node.js的堆栈,可能会解决这个问题。请访问http://devcenter.heroku.com/articles/cedar查看。 - c3rin

8
你不必须要一个 JavaScript 运行环境才能将 Rails 3.1 beta 部署到 heroku 上。
只有在部署时需要压缩 JavaScript (即通过 uglifier gem 完成) 或者使用 coffee-script 时才需要 JavaScript 运行环境。
看起来,在 3.1 正式版发布时,这个 JavaScript 运行环境依赖将不再存在。
如果你不介意不压缩 JavaScript(同时也不使用 coffee-script),那么你可以在 Gemfile 中注释掉 coffee-script、uglifier 和 execjs gems,并在 production.rb 中注释掉 config.assets.js_compressor,然后你就可以用它了。

5
截至本帖发布日期,您仍需要在gemfile中指定以下内容:
gem 'therubyracer-heroku','0.8.1.pre3'
这样才能成功将Rails 3.1应用程序部署到Heroku的Cedar平台上。虽然可以将Node应用程序部署到Cedar平台,但是当部署Rails应用程序时,Cedar堆栈上没有Node本身,因此必须捆绑自己的JavaScript运行时。
目前而言,我知道Rails方面的人正在努力消除对js运行时的依赖,详情请参见http://yehudakatz.com/2011/06/14/what-the-hell-is-happening-to-rails/,我相信Heroku也在寻找使Rails 3.1部署正常工作的方法。

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)):

使用“heroku config:add PATH blah”设置路径没有帮助。

“rake assets:precompile”解决了问题。

希望对像我一样的人有所帮助!


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