部署到Heroku后未加载更新的CSS样式表?

这对我来说已经有一段时间了,但是我仍然无法弄清楚Rails 4中的资产管道是如何工作的。我终于学会了如何预编译资产,但是在部署之后,我的CSS样式表再次没有了得到更新。

我通过访问开发人员工具并查看源来确认了这一点。 它看起来与我的CSS文件不同。 我的猜测是问题在于我的production.rb文件。

Production.rb

Games::Application.configure do config.cache_classes = true config.eager_load = true config.consider_all_requests_local = false config.action_controller.perform_caching = true config.serve_static_assets = true config.assets.js_compressor = :uglifier config.assets.compile = true config.assets.digest = true config.assets.version = '1.0' config.log_level = :info config.i18n.fallbacks = true config.active_support.deprecation = :notify config.log_formatter = ::Logger::Formatter.new end 

application.rb中

 require File.expand_path('../boot', __FILE__) require 'rails/all' Bundler.require(*Rails.groups) module Games class Application < Rails::Application config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) config.exceptions_app = self.routes end end 

这是我的Application.html.erb文件和帮助程序。

      true %>  true %>        

gem文件

 gem 'rails', '4.0.4' group :development, :test do gem 'sqlite3', '1.3.8' gem 'rspec-rails', '2.13.1' end group :production do gem 'pg', '0.17.1' gem 'rails_12factor' end group :test do gem 'selenium-webdriver', '2.35.1' gem 'capybara', '2.1.0' end gem 'sass-rails', '~> 4.0.2' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' gem 'sprockets-rails', '~> 2.0.0' gem 'bootstrap-sass', '2.3.2.0' gem 'jquery-rails' gem 'turbolinks' gem 'jbuilder', '~> 1.2' 

以下是我采取的步骤

 heroku run rake assets:precompile RAILS_ENV=production git add . git commit git push heroku master 

现在,也许我错了,但是已经运行了git add。 (意思是添加所有文件)它也应该加载了最新的样式表。 但是再一次,似乎Heroku失败了。

这种情况以前发生过,而且越来越烦人,所以我想找到解释。

感谢您的时间。

编辑:

我想我现在知道问题是什么了。 我的样式表永远不会更新到我的public / assets文件夹。 我不知道我能做些什么才能让它们出现在那里。

看起来您已在git仓库中添加了资产预编译文件。 理想情况下,它不应该存在,因为heroku可以在你push时为你做这件事。

要解决这个问题,你必须这样做

  1. git rm -r public/assets/
  2. .gitignore文件中添加public/assets/**
  3. git add .
  4. git commit -am "allow heroku auto assets precompilation"
  5. git push heroku master

好的,让我解释一下这对你有用


预编译

预编译您的资产将为您提供“不同的”文件/样式表。

这是因为预编译过程会将MD5哈希附加到资产文件的文件名中 – 为生产环境定义它们。 这称为“资产指纹识别” :

指纹识别是一种使文件名依赖于文件内容的技术。 文件内容更改时,文件名也会更改。 对于静态或不经常更改的内容,这提供了一种简单的方法来判断文件的两个版本是否相同,即使是跨不同的服务器或部署日期。

从本质上讲,预编译是Rails 缩小资产文件以进行生产的一种方式。 为什么这很重要? 几个原因 – 效率,文件大小和连接 :

在生产环境中,Sprockets使用上面概述的指纹识别方案。 默认情况下,Rails假定资产已经过预编译,并且将由Web服务器作为静态资产提供。


静态资产

当您上传到Heroku并在任何其他生产环境中运行时,Rails将期望您的资产被预编译。

预编译期望您的资产位于public/assets文件夹中 – 允许您的应用程序在准备就绪时调用它们。 这样做的问题是,如果您的资产未预编译,则可能会导致一些错误

您没有提到具体问题是什么。 内容有很多问题:

  1. 您需要使用资产路径助手来引用您的资产
  2. 您需要确保在布局等中调用了资产
  3. 您需要确保拥有正确的文件

以下是您需要做的底线:

$ rake assets:预编译RAILS_ENV =生产

这将在本地预编译您的资产

然后,您需要确保在布局中正确引用了资源:

 #app/views/layouts/application.html.erb <%= stylesheet_link_tag "application" %> 

这将使您能够在整个Rails应用程序中调用预编译资产。 这不包括语法问题,您可能会阻止预编译过程继续进行

按照这个

  1. rake资产:预编译
  2. git add。
  3. git commit -am“你的提交消息”
  4. git push heroku master

这是假设工作。

如果您在使用sass之前……在遇到所有其他问题之前……请确保您的资源文件夹中没有混合使用.css和.scss文件。
在编译资产时,Heroku似乎在混合两者时遇到一些麻烦。 我无法解释为什么会这样或者我的陈述是否属实……但是,根据我自己的经验,我必须做的就是将所有.css文件重命名为.scss。 并且,下一次推送……一切都正确加载。

如果您在阅读这些解决方案时没有成功,还需要考虑其他因素。

阻止我的css / scss文件更新生产的原因是我忽略了将.sass-cache添加到.gitignore,因此该文件夹已经提交到版本控制,因此覆盖了生产的更改。