Dlaczego Rails4 porzucił wsparcie dla grupy „asset” w Gemfile

99

W Rails 3 klejnoty używane wyłącznie do generowania aktywów w potoku aktywów zostały prawidłowo umieszczone w assetsgrupie 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

Teraz, zgodnie z (wciąż w toku) dokumentacją aktualizacji :

Rails 4.0 usunął grupę aktywów z Gemfile. Podczas aktualizacji musisz usunąć tę linię z pliku Gemfile.

Rzeczywiście, tworzenie nowego projektu z RC1 daje plik Gemfile z klejnotami związanymi z aktywami zawartymi domyślnie poza dowolną grupą:

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

...

Czy to oznacza, że ​​te klejnoty będą teraz domyślnie dołączane do kompilacji produkcyjnych? Jeśli tak, dlaczego zmiana zdania? Czy Rails 4 zmierza w kierunku dynamicznego generowania aktywów w produkcji?

jemmons
źródło
1
Nadal nie rozumiem, jaki był cel „grupy zasobów” i co zmieniło się w Railsach 4, co sprawiło, że grupa aktywów stała się niepotrzebna.
Michiel de Mare
23
„Grupa aktywów” była czymś innym dla różnych ludzi. Użyłem go jako miejsca do umieszczania klejnotów, których nie potrzebowałem w produkcji. Ale sądząc po rozmowie związanej z zaakceptowaną odpowiedzią, przynajmniej niektórzy ludzie w rails core wykorzystali ją jako sposób na upewnienie się, że nieskompilowane aktywa zawiodą przy 404 w produkcji (zamiast cichego automatycznego generowania, co doprowadziłoby do słabego występ). Zmieniło się to, że rails4 nie generuje już automatycznie zasobów, więc obejście "grupy zasobów" (jak widział to rails core) zostało usunięte.
jemmons
To jak dotąd najjaśniejsze wyjaśnienie. Jeśli umieścisz to w odpowiedzi, nagroda jest Twoja.
Michiel de Mare
@MichieldeMare Czułbym się dziwnie, otrzymując nagrodę za moje własne pytanie ;-) Jeśli masz na to ochotę, możesz dać nagrodę Filipe Giusti (zaakceptowana odpowiedź), ponieważ pomógł mi zrozumieć.
jemmons
3
Ostrzeżenie dla ludzi w przyszłości: Jeśli zdecydujesz się zignorować przewodnik aktualizacji Rails i zachowasz grupę zasobów w swoim Gemfile, pamiętaj, że Rails nie będą już automatycznie wymagać grupy zasobów podczas kompilowania zasobów w środowisku produkcyjnym. Musisz to zrobić samodzielnie lub dodać RAILS_GROUPS=assets(zobacz Rails.groups) przed poleceniem prekompilowania zasobów w środowisku produkcyjnym w środowisku kompilacji.
Ajedi32,

Odpowiedzi:

100

Wcześniej grupa aktywów istniała, aby uniknąć niezamierzonej kompilacji na żądanie w produkcji. Ponieważ Rails 4 już tak się nie zachowuje, sensowne było usunięcie grupy zasobów.

Jest to wyjaśnione bardziej szczegółowo w zatwierdzeniu, które to zmieniło. Wyciągnąłem kilka cytatów z rzeczywistą odpowiedzią.

Niektóre klejnoty mogą być potrzebne (w produkcji), takie jak szyny do kawy, jeśli używasz szablonów kawy i fakt, że teraz zasoby nie są już wstępnie kompilowane na żądanie w produkcji.

(nie prekompilowane na żądanie w środowisku produkcyjnym) Oznacza, że ​​jeśli masz te klejnoty w środowisku produkcyjnym w wersji 3.2.xi zapomnisz o prekompilacji, Railsy zrobią dokładnie to, co robią podczas programowania, prekompilują żądane zasoby. To już nie jest prawdą w Railsach 4, więc jeśli nie skompilujesz wstępnie zasobów używając zadań, otrzymasz 404, gdy zasoby są żądaniami.

Filipe Giusti
źródło
32
Czy to nie było także oszczędzanie pamięci? Teraz wszystkie perełki, nawet te, które nie są potrzebne w "produkcji" (tylko w prekompilacji), są ładowane, przez co railsy zajmują więcej pamięci?
gucki
3
+1 @gucki i czas ładowania. To było moje rozumienie grup. Ponieważ i tak była już opcja konfiguracji, aby wyłączyć kompilację na żywo. Co oznacza tutaj „wsparcie”. afaik moja aplikacja Rails 3 miała wiersz w pliku env / prod.rb, który ładował zasoby tylko w trakcie opracowywania. Jeśli to wszystko, czy mimo wszystko możemy to dodać?
Karthik T
Grupa aktywów została usunięta. Wcześniej klejnoty w zasobach były ładowane do produkcji, a teraz co, jeśli potrzebujemy ich również w produkcji. Dlatego powinny być ładowane w produkcji, a usunięcie grupy aktywów zapewnia to. Aktywa muszą zostać wstępnie skompilowane przed przeniesieniem do produkcji.
prashantsahni
13

Rails 4 próbują zmusić Cię do prekompilacji zasobów przed wdrożeniem. Musisz wstępnie skompilować swoje zasoby z

$ RAILS_ENV=production bundle exec rake assets:precompile

I dlaczego? Znalazłem to w przewodniku:

Domyślnie Railsy zakładają, że zasoby zostały wstępnie skompilowane i będą obsługiwane jako zasoby statyczne przez Twój serwer WWW.

(Źródło: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

Ale wiele razy będziesz musiał używać tych perełek „aktywów” w produkcji ... na przykład, jeśli używasz pliku js.coffee w katalogu views, to Rails również potrzebuje kompilatora kawy w trybie produkcyjnym.

Więc myślę, że powodem tej zmiany jest poprawa wydajności ... i wygląda też na prostszą. :)

Zoltan
źródło
22
Poręcze przy założeniu, że aktywa zostały skompilowane jest argumentem za utrzymywanie się assetsgrupę, a nie pozbycie się go (jeśli aktywa są skompilowane, wtedy te kamienie nie są potrzebne w produkcji i nie powinny być uwzględniane przez Bundler). I tak, może użyłbyś klejnotu jak coffee-railsw produkcji ... ale tak było też w Rails 3, prawda? Rails 3 są domyślnie umieszczane coffee-railsw assetsgrupie. Dlaczego więc zmiana na Rails 4?
jemmons
1
Dlaczego miałbyś używać pliku js.coffee w katalogu widoków? To powinno znaleźć się w zasobach / skryptach JavaScript.
Marnen Laibow-Koser
3

Chcemy Coffeescript z AJAX ( historią ), więc coffee-railswyprowadzamy się z grupy aktywów.
sass-railsźle się zachowuje ( historia ), więc wychodzi z grupy aktywów.

Ax grupa aktywów.

mockturtl
źródło
2
CoffeeScript nie powinien znajdować się w widokach. Bez tego możesz zrobić Ajax. Nie musisz dynamicznie generować JS, aby wykonać Ajax. W rzeczywistości nie powinieneś dynamicznie generować JS. Wstępnie skompiluj pliki CoffeeScript i całkowicie uniknij problemu.
Marnen Laibow-Koser
1
Sass-rails źle się zachowuje, ponieważ Bundler.require :assetsnie jest uruchamiany. To nie jest uzasadnienie, aby usunąć grupę aktywów. Nie chcę therubyracer, libv8 et c. na produkcji, dlaczego ktokolwiek to robi? Szablon kawy można skompilować do szablonu JS i nie ma sensu kompilować go za każdym razem, gdy podstawiana jest nowa wartość. Nie ma sensu brać tego całego ciężaru na produkcję.
phil pirozhkov