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

Posted

技术标签:

【中文标题】将 Rails 3.1 项目部署到 Heroku 时出现问题:找不到 JavaScript 运行时【英文标题】:Problem deploying Rails 3.1 project to Heroku: Could not find a JavaScript runtime 【发布时间】:2011-08-29 21:03:29 【问题描述】:

我在将 rails 3.1 beta 项目部署到 heroku 时遇到问题。问题发生在数据库迁移步骤。我跑的时候:

heroku rake db:migrate

我收到错误消息:

> 耙子中止! > 找不到 javascript 运行时。看 > https://github.com/sstephenson/execjs > 获取可用运行时列表。 > /app/Rakefile:5 > (通过使用 --trace 运行任务查看完整跟踪) >(在/应用程序中)

但是我可以在本地成功运行应用程序,并且我确实安装了 nodejs。知道为什么吗?

这是我的宝石清单:

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)

【问题讨论】:

【参考方案1】:

您需要一个用于 Rails 3.1 的 JavaScript 引擎(heroku 没有),而与 Heroku 一起使用的 JavaScript 引擎似乎是 rubyracer for heroku。

Rails 使用 execjs 执行 JavaScript,execjs 支持 7 个 JavaScript 引擎。 Node.js 就是其中之一,而 ruby​​racer 就是其中之一。

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 的doc。他们建议不要再使用“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。

【讨论】:

我刚刚尝试过这个,但是文件无法安装在 heroku 上。该问题的谷歌显示了许多类似的问题。 另外,可能需要将 config/initializers/session_store.rb 中的第 3 行更新为 MyApp::Application.config.session_store :cookie_store, :key => '_blahblahblah_session' 我确实在 Gemfile 中安装并使用了这个 gem。 # 资产模板引擎 gem 'sass' gem 'coffee-script' gem 'uglifier' gem 'jquery-rails' gem 'therubyracer-heroku', '0.8.1.pre3', :platforms => :ruby # 使用 unicorn 作为web server # gem 'unicorn' # 使用 Capistrano 部署 # gem 'capistrano' # 使用调试器 # gem 'ruby-debug19', :require => 'ruby-debug' group :test do # 漂亮的打印测试输出 gem 'turn' , :require => 假结束 对不起,我必须重新格式化我之前的评论。我确实在 Gemfile 中安装并使用了这个 gem: gem 'therubyracer-heroku', '0.8.1.pre3', :platforms => :ruby 但它没有用。 Heroku 现在有一个随 node.js 一起提供的堆栈,它可能会解决这个问题。查看devcenter.heroku.com/articles/cedar【参考方案2】:

您不一定需要 JavaScript 运行时来将 Rails 3.1 beta 部署到 heroku。

只有在部署时缩小 javascript(即通过 uglifier gem)或使用咖啡脚本时才需要 JavaScript 运行时。

看起来这个 javascript 运行时依赖项在 3.1 最终版本中将不存在。

如果您不介意不缩小 javascript(以及如果您不使用咖啡脚本),那么您可以注释掉 coffee-script、uglifier 和 execjs gem Gemfile 并在您的 production.rb 中注释掉 config.assets.js_compressor ,您应该一切顺利。

【讨论】:

【参考方案3】:

截至发文之日,您仍需说明

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

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

虽然可以将 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 部署正常工作的方法。

【讨论】:

【参考方案4】:

在我的情况下,它发生在成功上传到 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" 刚刚解决了它。

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

【讨论】:

以上是关于将 Rails 3.1 项目部署到 Heroku 时出现问题:找不到 JavaScript 运行时的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Rails + Webpacker 应用程序部署到 Heroku?

为啥 datatables.net 在我的 Rails 开发环境中可以工作,但在部署到 Heroku 时却不行?

在 Ruby on Rails 中使用 Heroku

使用webpack将Rails应用程序部署到heroku

将 Rails 应用程序部署到 Heroku 后,不显示 JQuery 函数中的图像

尝试将 Rails 应用程序部署到 heroku 时出现 Uglifier 错误