Ruby on rails 在Heroku部署上预编译资产失败,但在本地工作

Ruby on rails 在Heroku部署上预编译资产失败,但在本地工作,ruby-on-rails,heroku,sass,Ruby On Rails,Heroku,Sass,我最近开始尝试清理heroku应用程序中的一些css,但在尝试开始使用SCSS样式的变量时遇到了一些麻烦。我的方法基本上是创建一个theme.css.scss文件,其中包含所有颜色,然后在我的其他模块中使用这些颜色。为了解释这一点,我将其命名为bracket.css.scss 现在,我已经通过尽可能地减少内容来调试了它,问题似乎是heroku出于某种原因试图在没有在主题中设置变量的情况下编译括号文件。我把所有东西都砍掉了,所以我有以下几点: application.css.scss /* *

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

现在,我已经通过尽可能地减少内容来调试了它,问题似乎是heroku出于某种原因试图在没有在主题中设置变量的情况下编译括号文件。我把所有东西都砍掉了,所以我有以下几点:

application.css.scss

 /*
 *= require_self
 */

 @import "theme.css.scss";
 @import "bracket.css.scss";
$primary-red: #BC1414;
$faded-red: #3B1B1B;
$dark-red: #8a0f0f;
.Bracket li {
  color: $primary-red;
}
theme.css.scss

 /*
 *= require_self
 */

 @import "theme.css.scss";
 @import "bracket.css.scss";
$primary-red: #BC1414;
$faded-red: #3B1B1B;
$dark-red: #8a0f0f;
.Bracket li {
  color: $primary-red;
}
方括号.css.scss

 /*
 *= require_self
 */

 @import "theme.css.scss";
 @import "bracket.css.scss";
$primary-red: #BC1414;
$faded-red: #3B1B1B;
$dark-red: #8a0f0f;
.Bracket li {
  color: $primary-red;
}
现在,在本地运行
bundle exec rake assets:precompile RAILS\u ENV=production RAILS\u GROUPS=assets
,所有这些都可以很好地编译,但出于某种原因,heroku正在尝试编译这个文件。即使我从import语句中删除了bracket.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”。 远程:(in/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在预编译时失控吗?

首先在本地清理您的资产

rake assets:clean
然后将生产环境的预编译设置为false

config.assets.compile = false
然后汇编本地资产

rake assets:precompile

然后按heroku上的按钮

您确定在heroku上正在运行完全相同的命令:
bundle exec rake assets:precompile RAILS\u ENV=production RAILS\u GROUPS=assets
。你有heroku日志吗?你可以检查以确保这是真的吗?或者是一个heroku日志,其中说明执行的是哪个命令导致返回
Sass::SyntaxError
?Heroku不会自己进行任何资产预编译,某些rake任务或其他命令正在您的应用程序上执行,但您没有包含显示该任务的日志。答案可能就在那里。或者等等,这是在你将应用部署到heroku时发生的,还是在你访问一开始似乎已成功部署的应用时发生的?在部署到heroku时,我将稍微展开文本,但它处于预编译阶段。它做得很好,然后出错。至于@jrochkind问题,它只是说assets:precompile。我相信它确实运行了rake任务,但我不知道如何找到细节,如果有任何奇怪的选项会影响我等等,我只记得第一个face palm要检查:在资产预编译工作的本地副本中是否有任何未提交的更改或文件?执行
git状态检查
,确保它完全干净。如果您的本地副本与git中的不完全相同,那么当您尝试在本地复制时,heroku不会执行与您相同的源代码!我曾经遇到过这样的问题,是因为我忘了将一个文件完全添加到git或类似的东西,我花了一个小时才弄明白,然后我觉得自己像个白痴,呵呵。是的,干净得像哨子一样!再一次,我的直觉是,出于某种原因,它正试图编译更多。它可能确实与一些缓存有关,或者命令在某种程度上有所不同,我没有对此进行谴责。FWIW,编译完资产后在heroku上运行我上面列出的命令似乎有效?嘿,Keval!谢谢你的回复。在我最初的问题中,虽然我提到我已经使用了这种方法,但是我不想在本地执行这一步骤,因为有一些开发人员贡献和推动(试图保持简单,特别是git冲突和推动冲突等)。