2011-10-19 9 views
7

He estado ejecutando una aplicación de Rails 3.1 en Heroku Cedar Stack durante un par de meses. Estoy usando Rack middleware :: deflactor a gzip mi contenido y lograr esto medianteConflicto de Heroku entre los activos de gzip y los activos de precompilación

config.middleware.insert_before ActionDispatch::Static, Rack::Deflater 

en mi archivo staging.rb.

Sin embargo, desde la semana pasada, me sale el siguiente error al desplegar a Heroku

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

Sin embargo, ejecutar middleware rastrillo sigue devolviendo

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

Y el contenido servido todavía estaban gzip. Sin embargo, los activos no fueron compilados (minificados) ya que la precompilación falló. Una precompilación de rake manual :: asets tampoco ayuda.

Por lo tanto, asumo que ActionDispatch :: Static no está disponible durante la precompilación de los activos. Así que traté de insertar Rack :: Deflater antes de Rack :: Lock y ahora mis activos están compilados sin ningún mensaje de error, pero el contenido que se sirve no tiene gzip.

Entonces, ¿qué necesito hacer, tanto para gzip como para compilar mis recursos? ¿Qué me estoy perdiendo? Gracias.

Respuesta

3

Todavía no entiendo por qué Heroku no reconoce ActionDispatch :: Static durante la precompilación de activos. Sin embargo, la gente de Heroku sugirió una solución alternativa a este problema.

El middleware Rack :: Deflater debe insertarse en el archivo config.ru en lugar de los archivos de entorno. Algo así como,

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

De esta manera, no interfiere con los activos antes de la compilación y todavía gzips el contenido de ser servido.

Cualquier recurso sobre cómo funciona config.ru y dónde reside Rack :: Deflater es muy bienvenido.

+0

Esto es genial, pero no tan bueno como servir el archivo .gz que crea la cartera de activos. Me pregunto si hay alguna manera de hacer eso? – maletor

+1

Aquí está [una pregunta relacionada] (http://stackoverflow.com/questions/12326191/any-way-to-serve-gzip-assets-from-heroku) que puede ser útil. –

5

Solo un encabezado Rack::Deflateris already used by Rails 3.1 por lo que no es necesario que lo haga manualmente.

PERO, para responder a su problema aquí, asumiría que su production.rb tiene config.serve_static_assets = false conjunto.

el middleware ActionDispatch::Static solo se usa cuando serve_static_assets se establece en true. De hecho, Heroku inyecta esta configuración para anular cualquier cosa que establezcas (mira el mensaje de registro Injecting rails3_serve_static_assets al implementar), pero no estoy seguro de en qué etapa de la implementación sucede esto.

Por lo tanto, es probable que no tenga activado el servicio de activos estáticos cuando se ejecuta assets:precompile (tenga en cuenta que esto es sólo una suposición, no estoy en Rails 3.1 Pendiente por lo que podría estar equivocado)

recomendaría contra la sugerencia de añadir manualmente en su archivo rackup de membLoper:

  1. porque no es necesario como se explicó anteriormente
  2. su middleware que es relevante para su aplicación realmente debería ser inyectado como lo intentó originalmente en su application.rb
+0

Eso no parece ser el caso. ¿Puedes señalar la fuente principal? – maletor

Cuestiones relacionadas