Perché Rails4 ha abbandonato il supporto per il gruppo "assets" nel Gemfile


99

In Rails 3, le gemme utilizzate esclusivamente per generare asset nella pipeline di asset erano correttamente posizionate nel assetsgruppo del Gemfile:

...

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby
end

Ora, secondo la documentazione dell'aggiornamento (ancora in corso) :

Rails 4.0 ha rimosso il gruppo di asset da Gemfile. Dovresti rimuovere quella riga dal tuo Gemfile durante l'aggiornamento.

Abbastanza sicuro, realizzare un nuovo progetto con RC1 produce un Gemfile con gemme relative alle risorse incluse per impostazione predefinita al di fuori di qualsiasi gruppo:

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc1'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

...

Questo significa che queste gemme verranno ora raggruppate in build di produzione per impostazione predefinita? In caso affermativo, perché cambiare idea? Rails 4 si sta muovendo verso la generazione dinamica di asset in produzione?


1
Continuo a non capire quale fosse lo scopo del "gruppo di risorse" e cosa è cambiato in Rails 4 che ha reso il gruppo di risorse non necessario.
Michiel de Mare

23
Il "gruppo di risorse" era cose diverse per persone diverse. L'ho usato come luogo per mettere gemme che non avevo bisogno di raggruppare in produzione. Ma a giudicare dalla conversazione collegata alla risposta accettata, almeno alcune persone in rails core lo hanno usato come un modo per assicurarsi che gli asset non precompilati fallissero con un 404 in produzione (invece della silenziosa autogenerazione che porterebbe a poveri prestazione). Ciò che è cambiato è che rails4 non genera più automaticamente le risorse, quindi la soluzione alternativa "gruppo di risorse" (come la vedeva rails core) è stata rimossa.
jemmons

Questa è la spiegazione più chiara finora. Se lo metti in una risposta, la taglia è tua.
Michiel de Mare

@MichieldeMare Mi sentirei strano a ricevere una taglia per la mia stessa domanda ;-) Se ne hai voglia, potresti dare la taglia a Filipe Giusti (la risposta accettata) poiché è stato determinante nell'aiutarmi a capire.
jemmons

3
Un avvertimento per le persone in futuro: se scegli di ignorare la guida all'aggiornamento di Rails e mantenere il gruppo di asset nel tuo Gemfile, tieni presente che Rails non richiederà più automaticamente il gruppo di asset durante la compilazione degli asset in produzione. Dovrai farlo tu stesso o aggiungere RAILS_GROUPS=assets(vedi Rails.groups) prima del comando per precompilare gli asset in produzione nel tuo ambiente di compilazione.
Ajedi32

Risposte:


100

In precedenza il gruppo di asset esisteva per evitare la compilazione su richiesta involontaria nella produzione. Dato che Rails 4 non si comporta più così, aveva senso rimuovere il gruppo di risorse.

Questo è spiegato in modo più dettagliato nel commit che lo ha cambiato. Ho estratto alcune citazioni con la risposta effettiva.

Alcune gemme possono essere necessarie (in produzione) come le rotaie del caffè se si utilizzano modelli di caffè e il fatto che ora le risorse non sono più precompilate su richiesta in produzione.

(non precompilato su richiesta in produzione) Significa che se hai quelle gemme nell'ambiente di produzione in 3.2.x e dimentichi di precompilare, Rails farà esattamente quello che fa in sviluppo, precompilerà gli asset che sono stati richiesti. Questo non è più vero in Rails 4, quindi se non precompili le risorse usando i task otterrai un 404 quando le risorse sono richieste.


32
Non stava anche salvando la memoria? Ora tutte le gemme, anche quelle non necessarie in "produzione" (solo in precompilazione), vengono caricate e quindi rails consuma più memoria?
gucki

3
+1 @gucki e tempo di caricamento. Questa era la mia comprensione dei gruppi .. Dato che c'era già un'opzione di configurazione per disabilitare comunque la compilazione live. Cosa significa "supporto" qui. afaik la mia app Rails 3 aveva una riga in env / prod.rb che caricava le risorse solo in fase di sviluppo. Se è tutto, possiamo aggiungerlo comunque?
Karthik T

Il gruppo di risorse viene rimosso. In precedenza le gemme all'interno delle risorse venivano caricate in produzione, ora cosa succederebbe se ne avessimo bisogno anche in produzione. Quindi dovrebbero essere caricati nella produzione, la rimozione del gruppo di attività lo garantisce. Gli asset devono essere precompilati prima di passare alla produzione.
prashantsahni

13

Rails 4 cerca di obbligarti a precompilare le tue risorse prima della distribuzione. Devi precompilare le tue risorse con

$ RAILS_ENV=production bundle exec rake assets:precompile

E perché? Ho trovato questo nella Guida:

Per impostazione predefinita, Rails presume che gli asset siano stati precompilati e verranno serviti come asset statici dal tuo server web.

(Fonte: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

Ma molte volte devi usare queste gemme di "risorse" in produzione ... per esempio, se usi un file js.coffee nella tua directory delle viste, anche Rails ha bisogno del compilatore di caffè in modalità di produzione.

Quindi immagino che la ragione di questo cambiamento sia il miglioramento delle prestazioni ... e sembra anche più semplice. :)


22
Rails supponendo che le risorse siano state precompilate è un argomento per mantenere il assetsgruppo, non per eliminarlo (se le risorse sono precompilate, queste gemme non sono necessarie in produzione e non dovrebbero essere incluse dal bundler). E sì, forse useresti una gemma come coffee-railsnella produzione ... ma era così anche in Rails 3, giusto? E Rails 3 messo coffee-railsnel assetsgruppo, per impostazione predefinita. Allora perché il cambiamento per Rails 4?
jemmons

1
Perché dovresti usare un file js.coffee nella directory delle visualizzazioni? Dovrebbe andare in assets / javascripts.
Marnen Laibow-Koser

3

Vogliamo coffeescript con AJAX ( cronologia ), quindi coffee-railsesce dal gruppo di risorse.
sass-railssi comporta in modo anomalo ( cronologia ), quindi esce dal gruppo di risorse.

Ascia il gruppo di risorse.


2
CoffeeScript non dovrebbe essere nelle visualizzazioni. Puoi fare Ajax senza quello. Non è necessario generare dinamicamente JS per eseguire Ajax. In effetti, non dovresti generare dinamicamente JS. Precompila i tuoi file CoffeeScript ed evita completamente il problema.
Marnen Laibow-Koser

1
sass-rails si comporta male perché Bundler.require :assetsnon viene eseguito. Non è una logica per rimuovere il gruppo di risorse. Non voglio therubyracer, libv8 et c. in produzione, perché qualcuno lo fa? Il modello di caffè può essere compilato in un modello JS e non ha senso compilarlo ogni volta che viene sostituito un nuovo valore. Non ha senso portare tutto questo onere alla produzione.
phil pirozhkov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.