2013-05-06 11 views
96

In Rails 3 verwendeten Edelsteine ​​ausschließlich Vermögenswerte in der Asset-Pipeline zu erzeugen, wurden in der assets Gruppe der Gemfile richtig platziert gemäß der (noch in Bearbeitung) upgrade documentation:Warum Rails4 Drop-Unterstützung für "Vermögenswerte" Gruppe in der Gemfile

Rails 4.0 entfernt die Asset-Gruppe von Gemfile. Sie müssen diese Zeile beim Aktualisieren aus Ihrer Gemdatei entfernen.

Sicher genug, mit RC1 ein neues Projekt, die als Standard ein Gemfile mit vermögensbezogenen Edelsteine ​​ergibt außerhalb jeder Gruppe enthalten:

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 

... 

Enthält diese diese Edelsteine ​​bedeuten wird nun in der Produktion gebündelt baut standardmäßig? Wenn ja, warum die Veränderung des Herzens? Bewegt sich Rails 4 auf die dynamische Generierung von Assets in der Produktion?

+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 machte. –

+21

Die "Asset-Gruppe" war verschiedene Dinge für verschiedene Menschen. Ich benutzte es als einen Ort, um Edelsteine, die ich nicht gebündelt hatte, in die Produktion zu legen. Aber nach der Konversation, die mit der akzeptierten Antwort verbunden ist, benutzten zumindest einige Leute im Rails-Core es, um sicherzustellen, dass nicht vorkompilierte Assets mit einem 404 in der Produktion scheiterten (anstatt stillschweigend automatisch zu generieren, was zu schlechten Ergebnissen führen würde) Performance). Was sich geändert hat, ist, dass rails4 die Assets nicht automatisch generiert, sodass die Problemumgehung "Asset-Gruppe" entfernt wurde (so wie es der rails-core gesehen hat). – jemmons

+0

Das ist die klarste Erklärung noch. Wenn Sie es in eine Antwort geben, ist die Prämie Ihre. –

Antwort

95

Früher bestand die Assets-Gruppe, um eine unbeabsichtigte Zusammenstellung auf Abruf 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 the commit genauer erläutert, die das geändert hat. Ich habe einige Zitate mit der tatsächlichen Antwort extrahiert.

können Einige Edelsteine ​​benötigt werden (in der Produktion) wie Kaffee-Schienen, wenn Sie Kaffee-Vorlagen und die Tatsache verwenden, die jetzt Vermögenswerte werden nicht mehr auf die Nachfrage in der Produktion vorkompilierte.

(nicht vorkompiliert bei Bedarf in der Produktion) Bedeutet, dass, wenn Sie diese Edelsteine ​​in der Produktionsumgebung in 3.2.x haben und Precompile zu vergessen, Rails genau das tut, was es in der Entwicklung tut, die angeforderten Assets vorkompilieren. Dies ist in Rails 4 nicht mehr der Fall. Wenn Sie also die Assets mit den Tasks nicht vorkompilieren, erhalten Sie einen 404, wenn es sich um Assets handelt.

+32

War es nicht auch Speicher sparen? Nun werden alle Edelsteine, auch solche, die nicht in der "Produktion" benötigt werden (nur im Precompile), geladen und somit verbraucht Rails mehr Speicher? – gucki

+3

+1 @gucki und Ladezeit. Das war mein Verständnis der Gruppen .. Da gab es schon eine Config-Option, um Live Compile trotzdem zu deaktivieren. Was bedeutet "Unterstützung" hier? afaik meine Rails 3 App hatte eine Zeile in env/prod.rb, die Assets nur für die Entwicklung geladen hat. Wenn das alles ist, können wir es einfach hinzufügen? –

+5

"Vorkompiliert bei Bedarf" ... Oxymoron? –

13

Rails 4 versuchen Sie zu zwingen, Ihre Assets vor der Bereitstellung vorzukompilieren. Sie müssen Ihre Assets mit

vorkompilieren.

Und warum? fand ich dies in Guide:

standardmäßig Rails geht davon aus, dass Vermögenswerte vorkompilierte wurde und wird als statischen Vermögenswerte von Ihrem Web-Server bedient.

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

Aber viel Mal, wenn Sie diese ‚Vermögenswerte‘ Edelstein in der Produktion verwenden ... zum Beispiel, wenn Sie eine js.coffee Datei in Ihren Ansichten Verzeichnis verwenden, dann Rails benötigt auch im Produktionsmodus einen Kaffee-Compiler.

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

+22

Rails, die voraussetzen, dass Assets vorkompiliert wurden, sind ein Argument dafür, die Assets-Gruppe zu behalten und nicht loszuwerden (wenn Assets vorkompiliert werden, dann werden diese Edelsteine ​​in der Produktion nicht benötigt und sollten nicht vom Bundler einbezogen werden) . Und ja, vielleicht würden Sie ein Juwel wie "Coffee-Rails" in der Produktion verwenden ... aber das war auch in Rails 3 der Fall, oder? Und Rails 3 hat standardmäßig "Coffee-Rails" in der Gruppe "Assets" platziert. Warum also die Änderung für Rails 4? – jemmons

+1

Warum würden Sie eine js.coffee-Datei in Ihrem Sichtenverzeichnis verwenden? Das sollte in Assets/Javascripts gehen. –

3

Wir wollen mit AJAX Coffeescript (history), so coffee-rails bewegt sich aus dem Vermögen Gruppe.
sass-rails misshandelt (history), so bewegt es sich aus der Asset-Gruppe.

Ax die Vermögensgruppe.

+2

CoffeeScript sollte nicht in Sichten sein. Sie können Ajax ohne das tun. Sie müssen JS nicht dynamisch generieren, um Ajax auszuführen. In der Tat sollten Sie JS nicht dynamisch generieren. Precompile Ihre CoffeeScript-Dateien und vermeiden Sie das Problem vollständig. –

+1

sass-rails misshandelt, weil 'Bundler.require: assets' nicht ausgeführt wird. Das ist kein Grund, die Asset-Gruppe zu entfernen. Ich will nicht therubyracer, libv8 und c. auf die Produktion, warum tut jemand? Kaffee-Vorlage kann zu einer JS-Vorlage kompiliert werden, und es gibt keinen Punkt, es jedes Mal zu kompilieren, wenn ein neuer Wert ersetzt wird. Es macht keinen Sinn, all diese Last auf die Produktion zu nehmen. –

Verwandte Themen