【问题标题】:Precompiling assets fails on Heroku deploy but works locallyHeroku 部署时预编译资产失败,但在本地工作
【发布时间】:2015-03-04 00:08:32
【问题描述】:

我最近开始尝试在 Heroku 应用程序中清理一些 CSS,但在尝试开始使用 SCSS 样式变量时遇到了一些麻烦。我的方法本质上是创建一个包含所有颜色的 theme.css.scss 文件,然后在我的其他模块中使用这些颜色。为了解释这一点,我将其称为bracket.css.scss

现在我已经通过尽可能多地减少内容来调试这个问题,问题似乎是 heroku 出于某种原因试图在没有在主题中设置变量的情况下编译括号文件。我已经删除了所有内容,因此我拥有以下内容:

application.css.scss

 /*
 *= require_self
 */

 @import "theme.css.scss";
 @import "bracket.css.scss";

theme.css.scss

$primary-red: #BC1414;
$faded-red: #3B1B1B;
$dark-red: #8a0f0f;

bracket.css.scss

.Bracket li {
  color: $primary-red;
}

现在在本地,通过运行bundle exec rake assets:precompile RAILS_ENV=production RAILS_GROUPS=assets,这一切都可以正常编译,但由于某种原因,heroku 正在尝试编译该文件。即使我从导入语句中删除括号.css.scss 并将其保留在目录中,它仍然会尝试编译它并仍然给出错误:

remote:        Running: rake assets:precompile
remote:        I, [2015-03-04T01:26:27.759654 #541]  INFO -- : Writing /tmp/build_9a38718ecc0e6f745aaabdf36773113f/public/assets/application-06ee955f8c010c7ce7ddac90c464ee2b.js

远程:rake 中止! Sass::SyntaxError:未定义变量:“$primary-red”。 远程:(在/tmp/build_fc4a2b49d91462a9a653dc2e95ed1439/app/assets/stylesheets/bracket.css.scss:6)

(旁注:我确实在生产环境中安装了“rails_12factor”gem)

我什至尝试过修改 production.rb 并将预编译列表覆盖为 config.assets.precompile = ["application.js", "application.css"]

目前我已经通过在本地预编译并提交来解决这个问题,但这不是我的首选方法。似乎 heroku 只是单独编译树中的所有内容,而不是读取 application.css。难道我做错了什么?有什么方法可以防止 Heroku 因预编译而疯狂?

【问题讨论】:

  • 你确定在 heroku 上正在运行完全相同的命令:bundle exec rake assets:precompile RAILS_ENV=production RAILS_GROUPS=assets。你有一个heroku日志,你可以检查以确保这是真的?或者一个heroku日志,说明正在执行什么命令导致Sass::SyntaxError被返回? Heroku 不会自行进行任何资产预编译,some rake 任务或其他命令正在您的应用程序上执行,但您没有包含显示哪个日志的日志。答案可能就在那里。
  • 或者等等,这个是在你将应用部署到heroku时出现的,还是在你访问一开始似乎已经成功部署的应用时出现的?
  • 在部署到 heroku 时,我会稍微扩展一下文本,但它处于预编译阶段。它做的js很好然后出错了。至于@jrochkind 问题..它只是说资产:预编译。我相信它确实会运行 rake 任务,但如果有任何奇怪的选项会影响它,我不知道如何找到细节
  • 哦,等等,我只记得要检查的第一个 face-palm 陷阱:您的本地副本中是否有任何未提交的更改或文件,资产预编译在哪里工作?做一个git status 并确保它完全干净。如果您的本地副本与 git 中的内容不完全一致,那么当您尝试在本地复制时,heroku 不会执行与您相同的源!我遇到过这样的问题,因为我忘记将文件完全添加到 git 或类似的东西,我花了一个小时才弄清楚,然后我觉得自己像个白痴,呵呵。
  • 是的,干净利落!同样,我的直觉是它出于某种原因试图编译更多。它可能确实与某些缓存或命令以某种我没有复制或其他方式不同的方式有关。 FWIW,编译资产后在heroku上运行我上面列出的命令似乎有效?

标签: ruby-on-rails heroku sass


【解决方案1】:

首先在本地清理你的资产

rake assets:clean

然后将生产环境的预编译设为false

config.assets.compile = false

然后编译本地资源

rake assets:precompile

然后推heroku

【讨论】:

  • 嘿凯瓦尔!感谢您的回复。在我最初的问题中,虽然我提到我已经使用了这种方法,但是我不想在本地执行该步骤,因为有一些开发人员贡献和推动(试图让事情变得简单,尤其是 git 冲突和推动冲突和东西)。
猜你喜欢
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2013-03-03
  • 2022-01-26
  • 2014-01-09
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多