在将 Rails 应用程序推送到 Heroku 之前要执行哪些步骤?

What steps to follow before pushing a Rails app to Heroku?

我有一个非常简单的应用程序,几乎没有 Ruby 代码,没有数据库,只有一个包含 html、css、jquery 的页面和一个简单的联系表。尽管如此,像往常一样,推向 Heroku 只是一个婊子。每次我尝试推送时,哪些元素在起作用似乎是随机的。首先我得到一个错误。然后样式表没有被包含在内。然后是图像和 Fontawesome。现在这两个都在工作,但没有 Javascript/jQuery.

在推送之前我需要执行哪些实际步骤,因为这是一个废话。我基本上只是 运行 随机预编译然后尝试再次上传,每次上传不同的东西。

不过有趣的是,当我 运行 a RAILS_ENV=production bundle exec rake assets:precompile 时,我得到了与我第一次尝试推送到 Heroku 时相同的错误(但当我推):

rake aborted!
ExecJS::ProgramError: Name expected (line: 15546, col: 4, pos: 453566)

Error
at new JS_Parse_Error (/tmp/execjs20150126-3561-i1rcaljs:2359:10623)
at js_error (/tmp/execjs20150126-3561-i1rcaljs:2359:10842)
at croak (/tmp/execjs20150126-3561-i1rcaljs:2359:19086)
at as_symbol (/tmp/execjs20150126-3561-i1rcaljs:2359:29188)
at vardefs (/tmp/execjs20150126-3561-i1rcaljs:2359:25758)
at var_ (/tmp/execjs20150126-3561-i1rcaljs:2359:25996)
at /tmp/execjs20150126-3561-i1rcaljs:2359:21785
at /tmp/execjs20150126-3561-i1rcaljs:2359:19957
at block_ (/tmp/execjs20150126-3561-i1rcaljs:2359:24599)
at ctor.body (/tmp/execjs20150126-3561-i1rcaljs:2359:24233)
(in /home/my_name/Desktop/rails/bsun/app/assets/javascripts/application.js)/home/my_name/.rvm/gems/ruby-2.2.0/gems/execjs-2.2.2/lib/execjs/external_runtime.rb:64:in `extract_result'

那么我应该如何解决这个问题呢?什么的第 15546 行?

自从我第一次尝试推送失败以来,以下是我必须解决和添加的问题:

  1. 尽管没有数据库,但已在生产中添加 gem 'pg'
  2. 在 production.rb 中添加了 config.assets.compile = trueconfig.serve_static_assets = true
  3. 运行rake assets:precompile十几次。
  4. 运行 RAILS_ENV=production bundle exec rake assets:precompile 未成功。

我还需要做什么才能将一个简单的页面推送到 Heroku?

编辑:下面的答案很好,我只是想添加一些细节,以防有人像我一样不熟练并遇到类似问题。

  1. 让 Heroku 处理所有预编译是一个很好的技巧。不要触及有关处理静态资产的设置或 production.rb 中的任何内容,无论有多少人在 SO 上的各种其他线程中提出建议。我的意思是,我确信这对某些事情和对知道自己在做什么的人有好处,但听那些人的意见让我陷入了很多麻烦。如果您听从他们的建议,则在部署时必须遵循一组完全不同的步骤。

  2. 如果您遇到像我这样的错误 (ExecJS::ProgramError: Name),您可以忽略它后面的内容,只需在浏览器中打开页面上的 Javascript 控制台(Ctrl- Shift-J for Chrome) 并检查它是否 returns 有任何错误。在我的例子中,它确实如此,但即使它没有逐块删除 Javascript 代码然后 运行ning RAILS_ENV=production bundle exec rake assets:precompile 在本地也是一个解决它的好方法。我有一个逗号而不是分号,它以某种方式使代码在浏览器中工作,但在控制台以及预编译时抛出错误。另外,不要忘记在部署到 Heroku 之前恢复到预编译或 运行 RAILS_ENV=production bundle exec rake assets:clean 之前。

  3. 我通过将 scss 语法更改为 background: image-url('name-of-img.png') from background: url('name-of-img') 不知何故,它神奇地起作用了。

呸!

首先,我要说的是,您可能不需要 rails,您可以使用静态网站,可以使用 jekyll 等工具创建例如。

如果您确实想使用 rails 和 heroku,那么 Heroku 需要一些东西(如果缺少它们,将会注入到您的应用程序中)。文档说明您需要将您的应用程序配置为使用 postgreSQL,所以我想您需要 postgres gem.

要提供静态资产,只需添加 12factor gem: gem 'rails_12factor', group: :production

通过这种方式,您可以删除 config.serve_static_assets 配置选项,一切正常。

资产管道和 Heroku 一直是许多人困惑的根源,我发现让它工作的最简单方法就是 让 Heroku 为您修复资产编译。所以不要先在本地 运行 rake assets:precompile,让 Heroku 处理(当您将代码推送到他们的存储库时,他们会在部署过程中这样做)。因此,改为设置 config.assets.compile = false

我还建议按照 docs 中概述的步骤使用 rails 和雪松堆栈。

首先,使用 Heroku 命令行客户端 (heroku create) 创建您的 Heroku 应用程序,然后 运行 git push heroku master 就可以了。