Heroku在gzipping资产和预编译资产之间发生冲突

时间:2011-10-19 16:20:44

标签: ruby-on-rails heroku gzip

我已经在Heroku Cedar Stack上运行了Rails 3.1应用程序几个月了。我正在使用Rack :: Deflater中间件来gzip我的内容,并通过

来实现
config.middleware.insert_before ActionDispatch::Static, Rack::Deflater

在我的staging.rb文件中。

但是,从上周开始,部署到Heroku时出现以下错误

Running: rake assets:precompile
   rake aborted!
   No such middleware to insert before: ActionDispatch::Static

但是,运行rake中间件仍会返回

use Rack::Cache
use Rack::Deflater
use ActionDispatch::Static
use Rack::Lock

服务的内容仍然是gzip压缩。但是,由于预编译失败,资产未编译(缩小)。手动rake预编译:: asets也无济于事。

所以,我假设在预编译资产期间ActionDispatch :: Static不可用。所以我尝试在Rack :: Lock之前插入Rack :: Deflater,现在我的资产编译时没有任何错误消息,但是服务的内容不是gzip压缩。

那么,我需要做什么,gzip和编译我的资产?我错过了什么?感谢。

2 个答案:

答案 0 :(得分:5)

只需抬头Rack::Deflater is already used by Rails 3.1,这样您就不需要手动执行此操作。

但是,为了在这里回答您的问题,我认为您的production.rb设置了config.serve_static_assets = false

仅在ActionDispatch::Static设置为serve_static_assets时才使用true中间件。 Heroku实际上会注入此配置来覆盖您设置的任何内容(部署时请参阅Injecting rails3_serve_static_assets日志消息),但我不确定部署发生的阶段。

因此,当assets:precompile运行时,你可能没有启用静态资产服务(注意这只是一个猜测,我还没有在Rails 3.1上,所以我可能是错的)

我建议不要让membLoper建议在你的机架文件中手动添加它:

  1. 如上所述,不需要它
  2. 与您的应用相关的中间件应该像您最初在application.rb
  3. 中尝试的那样注入

答案 1 :(得分:3)

我仍然不明白为什么Heroku在预编译资产时无法识别ActionDispatch :: Static。然而,Heroku人确实建议解决这个问题。

Rack :: Deflater中间件需要插入config.ru文件而不是环境文件。像,

require ::File.expand_path('../config/environment',  __FILE__)
# Middleware to gzip content
use Rack::Deflater
run MyApplication

这样,它不会干扰资源预编译,并且仍会对正在提供的内容进行gzip压缩。

有关config.ru如何工作以及Rack :: Deflater现在所在的任何资源都非常受欢迎。