Warum hat Rails4 die Unterstützung für die Gruppe "Assets" in der Gemfile eingestellt?

99

In Rails 3 wurden Edelsteine, die ausschließlich zur Generierung von Assets in der Asset-Pipeline verwendet wurden, ordnungsgemäß in die assetsGruppe der Gemfile eingefügt:

...

# 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

Laut der (noch laufenden) Upgrade-Dokumentation :

Rails 4.0 hat die Assets-Gruppe aus Gemfile entfernt. Sie müssten diese Zeile beim Upgrade aus Ihrer Gemfile entfernen.

Sicher genug, wenn Sie ein neues Projekt mit RC1 erstellen, erhalten Sie eine Gem-Datei mit Asset-bezogenen Gems, die standardmäßig außerhalb einer Gruppe enthalten sind:

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

...

Bedeutet dies, dass diese Edelsteine ​​jetzt standardmäßig in Produktions-Builds gebündelt werden? Wenn ja, warum die Veränderung des Herzens? Bewegt sich Rails 4 in Richtung einer dynamischen Generierung von Assets in der Produktion?

Jemmons
quelle
1
Ich verstehe immer noch nicht, was der Zweck der "Asset-Gruppe" war und was sich in Rails 4 geändert hat, was die Asset-Gruppe unnötig gemacht hat.
Michiel de Mare
23
Die "Vermögensgruppe" war für verschiedene Menschen unterschiedlich. Ich nutzte es als Ort, um Edelsteine ​​zu platzieren, die ich in der Produktion nicht gebündelt brauchte. Nach dem Gespräch zu urteilen, das in der akzeptierten Antwort enthalten ist, haben zumindest einige Leute im Schienenkern damit sichergestellt, dass nicht vorkompilierte Assets mit einem 404 in der Produktion versagten (anstatt stillschweigend automatisch zu generieren, was zu einer schlechten Leistung führen würde Performance). Was sich geändert hat, ist, dass Rails4 keine Assets mehr automatisch generiert. Daher wurde die Problemumgehung "Asset Group" (wie Rails Core es sah) entfernt.
Jemmons
Das ist die bisher klarste Erklärung. Wenn Sie es in eine Antwort einfügen, liegt das Kopfgeld bei Ihnen.
Michiel de Mare
@MichieldeMare Ich würde mich komisch fühlen, ein Kopfgeld für meine eigene Frage zu bekommen ;-) Wenn Sie Lust dazu haben, können Sie das Kopfgeld an Filipe Giusti (die akzeptierte Antwort) geben, da er maßgeblich zum Verständnis beigetragen hat.
Jemmons
3
Eine Warnung für zukünftige Benutzer: Wenn Sie das Rails-Upgrade-Handbuch ignorieren und die Asset-Gruppe in Ihrer Gemfile behalten, beachten Sie, dass Rails die Asset-Gruppe beim Kompilieren von Assets in der Produktion nicht mehr automatisch benötigt. Sie müssen dies entweder selbst tun oder vor dem Befehl hinzufügen RAILS_GROUPS=assets(siehe Rails.groups), um Assets in der Produktion in Ihrer Build-Umgebung vorkompilieren zu können.
Ajedi32

Antworten:

100

Zuvor bestand die Asset-Gruppe, um eine unbeabsichtigte Kompilierung nach Bedarf in der Produktion zu vermeiden. Da sich Rails 4 nicht mehr so ​​verhält, war es sinnvoll, die Asset-Gruppe zu entfernen.

Dies wird in dem Commit , das dies geändert hat, ausführlicher erläutert . Ich habe einige Zitate mit der tatsächlichen Antwort extrahiert.

Einige Edelsteine ​​können (in der Produktion) wie Kaffeeschienen benötigt werden, wenn Sie Kaffeeschablonen verwenden und die Tatsache, dass Assets jetzt nicht mehr bei Bedarf in der Produktion vorkompiliert werden.

(nicht bei Bedarf in der Produktion vorkompiliert) Bedeutet, dass Rails genau das tut, was es in der Entwicklung tut, und die angeforderten Assets vorkompiliert, wenn Sie diese Edelsteine ​​in der Produktionsumgebung in 3.2.x haben und die Vorkompilierung vergessen. Dies gilt in Rails 4 nicht mehr. Wenn Sie die Assets nicht mithilfe der Aufgaben vorkompilieren, erhalten Sie eine 404, wenn es sich bei den Assets um Anforderungen handelt.

Filipe Giusti
quelle
32
Sparte es nicht auch Speicher? Jetzt werden alle Edelsteine ​​geladen, auch diejenigen, die in der "Produktion" nicht benötigt werden (nur beim Vorkompilieren), und Schienen verbrauchen somit mehr Speicher?
Gucki
3
+1 @gucki und Ladezeit. Dies war mein Verständnis der Gruppen. Da es bereits eine Konfigurationsoption gab, um die Live-Kompilierung trotzdem zu deaktivieren. Was bedeutet "Unterstützung" hier? afaik my Rails 3 App hatte eine Zeile in env / prod.rb, die Assets nur bei der Entwicklung lud. Wenn das alles ist, können wir es trotzdem hinzufügen?
Karthik T
Die Vermögensgruppe wird entfernt. Früher wurden die Edelsteine ​​in den Assets in die Produktion geladen. Was ist, wenn wir sie auch in der Produktion brauchen? Daher sollten sie in der Produktion geladen werden, die Entfernung der Vermögensgruppe stellt dies sicher. Die Assets müssen vor der Verlagerung in die Produktion vorkompiliert werden.
Prashantsahni
13

Rails 4 versucht, Sie zu zwingen, Ihre Assets vor der Bereitstellung vorkompilieren zu müssen. Sie müssen Ihr Vermögen mit vorkompilieren

$ RAILS_ENV=production bundle exec rake assets:precompile

Und warum? Ich habe dies in Guide gefunden:

Standardmäßig geht Rails davon aus, dass Assets vorkompiliert wurden und von Ihrem Webserver als statische Assets bereitgestellt werden.

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

Aber oft müssen Sie diese "Assets" -Edelsteine ​​in der Produktion verwenden. Wenn Sie beispielsweise eine js.coffee-Datei in Ihrem Ansichtsverzeichnis verwenden, benötigt Rails den Kaffee-Compiler auch im Produktionsmodus.

Ich denke, der Grund für diese Änderung ist die Leistungsverbesserung ... und sieht auch einfacher aus. :) :)

Zoltan
quelle
22
Schienen, die davon ausgehen, dass Assets vorkompiliert wurden, sind ein Argument dafür , die assetsGruppe zu behalten und nicht loszuwerden (wenn Assets vorkompiliert werden, werden diese Edelsteine ​​in der Produktion nicht benötigt und sollten nicht vom Bundler aufgenommen werden). Und ja, vielleicht würden Sie einen Edelstein wie coffee-railsin der Produktion verwenden ... aber das war auch in Rails 3 der Fall, oder? Und Rails 3 wird standardmäßig coffee-railsin die assetsGruppe aufgenommen. Warum also die Änderung für Rails 4?
Jemmons
1
Warum sollten Sie eine js.coffee-Datei in Ihrem Ansichtsverzeichnis verwenden? Das sollte in Assets / Javascripts gehen.
Marnen Laibow-Koser
3

Wir wollen Coffeescript mit AJAX ( Verlauf ), also ziehen wir uns coffee-railsaus der Vermögensgruppe heraus.
sass-railsFehlverhalten ( Verlauf ), so dass es aus der Vermögensgruppe herausgeht.

Axt die Vermögensgruppe.

mockturtl
quelle
2
CoffeeScript sollte nicht in Ansichten sein. Sie können Ajax ohne das tun. Sie müssen JS nicht dynamisch generieren, um Ajax auszuführen. Tatsächlich sollten Sie JS nicht dynamisch generieren. Kompilieren Sie Ihre CoffeeScript-Dateien vor und vermeiden Sie das Problem vollständig.
Marnen Laibow-Koser
1
Sass-Rails benehmen sich schlecht, weil sie Bundler.require :assetsnicht gefahren werden. Dies ist kein Grund, eine Vermögensgruppe zu entfernen. Ich will keinen Therubyracer, libv8 usw. Warum macht jemand in der Produktion? Kaffeevorlage kann zu einer JS-Vorlage kompiliert werden, und es macht keinen Sinn, sie jedes Mal zu kompilieren, wenn ein neuer Wert ersetzt wird. Es macht keinen Sinn, all diese Last auf die Produktion zu übertragen.
Phil Pirozhkov