2015-11-27 11 views
10

Sto lavorando a un'app Rails con un numero elevato di risorse, che purtroppo non possono essere ridotte. Nella produzione questo non è un problema, ma in fase di sviluppo, ~ 20 richieste di asset per pagina visitata non possono essere rapidamente servite da un server di applicazioni (come webrick o Thin).Compilare automaticamente le risorse e servirle con nginx (sviluppo)

Così ho iniziato a utilizzare nginx in sviluppo per servire qualsiasi cosa in public/assets. Si noti che nginx è puramente una struttura di sviluppo - non intendiamo usarlo in produzione.

Per farlo funzionare ho dovuto fare due cose:

  • Impostare config.assets.debug false
  • corsa rake assets:precompile

Purtroppo ci sono due problemi (quest'ultimo è il più importante) con il mio setup:

  • Ogni modifica delle risorse richiede manualmente in esecuzione rake assets:precompile di nuovo
  • Per il server delle app per raccogliere le risorse appena compilate, devo riavviarlo.

Che cos'è un setup nginx/Asset Pipeline corretto che non richiede il riavvio del server Rails dopo la precompilazione?

La compilazione automatica sarebbe anche il benvenuto.

+2

Avete provato gli altri server Rails come Unicorn e Puma? Potresti sempre usare [Guard] (https://github.com/guard/guard) per monitorare le modifiche ai file ed eseguire "rake assets: precompile' e riavviare il server. – max

+0

+1 per guardia. Unicorn/Puma non sono server HTTP specializzati (in particolare Unicorn che presuppone la rapida progettazione dei client) quindi preferirei usare nginx per le risorse se possibile. – vemv

+0

Questo sembra un po 'come se fosse superata la pipeline delle risorse - Rails non è realmente costruito per servire asset statici in fase di sviluppo - dovrebbe essere fatto in fase di deployment. Quindi riavviare il server sarà piuttosto goffo. Quindi potresti usare, ad esempio, il grunt o il broccolli per ridurre le tue risorse. – max

risposta

3

Questa messa a punto ha funzionato per me:

  • Includere il porto nginx in config.asset_host
  • config.assets.debug = false
  • config.assets.digest = true
  • config.assets.compile = true
  • prima di avviare il server di Rails, eseguire rm -rf public/assets; rake tmp:clear tmp:cache:clear assets:clean assets:precompile
  • lancio Rails server
  • Per ogni modifica delle risorse, eseguire di nuovo rake assets:precompile. La guardia può prendersene cura.
1

Ciò potrebbe richiedere un notevole sforzo, ma è consigliabile passare a gulp o grunt per compilare le risorse. L'utilizzo del nodo js può accelerare il processo in modo significativo (un sacco di articoli su di esso, ecco un esempio uno http://blog.carbonfive.com/2014/05/05/roll-your-own-asset-pipeline-with-gulp/). E anche le risorse importanti possono essere compilate senza il riavvio del server (processo avviato al cambio di file [hook]). Nel progetto sono coinvolto uno dei nostri ragazzi sta cercando di fare questo tipo di interruttore, e da quello che dice capisco che non è un compito di un giorno.

Problemi correlati