2011-10-19 11 views
7

Ho eseguito un'applicazione Rails 3.1 su Heroku Cedar Stack per un paio di mesi. Sto usando Rack :: Deflater middleware a gzip miei contenuti e raggiungere questo obiettivoConflitto di Heroku tra risorse gzip e risorse precompilate

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

nel mio file staging.rb.

Tuttavia, dal momento che la scorsa settimana, ricevo il seguente errore durante la distribuzione di Heroku

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

Tuttavia, l'esecuzione rastrello middleware restituisce comunque

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

e contenuti servita erano ancora gzip. Tuttavia, le risorse non sono state compilate (minificate) poiché la pre-compilazione non è riuscita. Un precompilamento manuale del rake :: anche gli asets non aiutano.

Quindi, presumo che ActionDispatch :: Static non sia disponibile durante la pre-compilazione delle risorse. Così ho provato a inserire Rack :: Deflater prima di Rack :: Lock e ora le mie risorse sono compilate senza alcun messaggio di errore ma il contenuto non è gzip.

Quindi, cosa devo fare, sia per gzip che per compilare le mie risorse? Cosa mi manca? Grazie.

risposta

3

Non riesco ancora a capire perché Heroku non riconosce ActionDispatch :: Static durante la pre-compilazione delle risorse. Tuttavia, la gente di Heroku ha suggerito una soluzione a questo problema.

Il middleware Rack :: Deflater deve essere inserito nel file config.ru anziché nei file di ambiente. Qualcosa di simile,

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

In questo modo, non interferisce con le attività di pre-compilazione e gzip ancora il contenuto che viene servito.

Qualsiasi risorsa su come funziona config.ru e dove Rack :: Deflater risiede ora è molto gradita.

+0

Questo è bello, ma non così interessante come servire il file .gz creato dalla pipeline di asset. Mi chiedo se c'è un modo per farlo? – maletor

+1

Ecco [una domanda correlata] (http://stackoverflow.com/questions/12326191/any-way-to-serve-gzip-assets-from-heroku) potresti trovare utile. –

5

Basta un avviso Rack::Deflateris already used by Rails 3.1 in modo da non doverlo fare manualmente.

MA, per rispondere al problema qui, suppongo che il tuo production.rb abbia impostato config.serve_static_assets = false.

il middleware ActionDispatch::Static viene utilizzato solo quando serve_static_assets è impostato su true. Heroku in effetti inietta questa configurazione per ignorare qualsiasi cosa tu abbia impostato (vedi il messaggio di registro Injecting rails3_serve_static_assets quando si distribuisce), ma non sono sicuro di quale fase della distribuzione avvenga.

Quindi è probabile che non sia disponibile la funzione di gestione delle risorse statiche quando si esegue assets:precompile (notare che si tratta solo di un'ipotesi, io non sono su Rails 3.1 eppure così potrei sbagliarmi)

mi sento di raccomandare contro il suggerimento di membLoper di aggiungere manualmente nel file rackup:

  1. non è necessaria come spiegato sopra
  2. middleware che è rilevante per la vostra applicazione dovrebbe essere iniettato come originariamente provato nel tuo application.rb
+0

Questo non sembra essere il caso. Puoi indicare la fonte primaria? – maletor

Problemi correlati