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

mem*_*per 7 gzip ruby-on-rails heroku

我已经在Heroku Cedar Stack上运行了一个Rails 3.1应用程序几个月了.我正在使用Rack :: Deflater中间件来gzip我的内容,并实现这一目标

config.middleware.insert_before ActionDispatch::Static, Rack::Deflater
Run Code Online (Sandbox Code Playgroud)

在我的staging.rb文件中.

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

Running: rake assets:precompile
   rake aborted!
   No such middleware to insert before: ActionDispatch::Static
Run Code Online (Sandbox Code Playgroud)

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

use Rack::Cache
use Rack::Deflater
use ActionDispatch::Static
use Rack::Lock
Run Code Online (Sandbox Code Playgroud)

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

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

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

bra*_*rad 5

Rack::Deflater 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建议在你的rackup文件中手动添加它:

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


mem*_*per 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
Run Code Online (Sandbox Code Playgroud)

这样,它就不会干扰资产预编译,并且仍然对所提供的内容进行 gzip 压缩。

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