Чому Rails4 відмовився від підтримки групи "активи" в Gemfile


99

У Rails 3 дорогоцінні камені, що використовуються виключно для отримання активів у конвеєрі активів, були належним чином розміщені у assetsгрупі 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

Тепер, відповідно до (ще триває) документації щодо оновлення :

Rails 4.0 видалив групу активів із Gemfile. Під час оновлення вам потрібно буде видалити цей рядок зі свого Gemfile.

Звичайно, створення нового проекту з RC1 дає Gemfile з дорогоцінними дорогоцінними каменями, включеними за замовчуванням за межами будь-якої групи:

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

...

Чи означає це, що ці дорогоцінні камені тепер за замовчуванням будуть вбудовуватися у виробничі комплекти? Якщо так, то чому змінити серце? Чи рухається Rails 4 до динамічного генерування активів у виробництві?


1
Я досі не розумію, якою була мета "групи активів", і що змінилося в Rails 4, що зробило групу активів непотрібною.
Міхель де Маре

23
"Група активів" була різною для різних людей. Я використовував це як місце, щоб поставити дорогоцінні камені, які мені не потрібні у виробництві. Але судячи з розмови, пов’язаної з прийнятою відповіддю, принаймні деякі люди в ядрах рейок використовували це як спосіб переконатись, що активи, які не були складені, не вийшли з виробництва 404 (замість того, щоб мовчки автоматично генерувати, що призведе до бідних виконання). Що змінилось, це rails4 більше не генерує активи, тому рішення "групи активів" (як бачили рейки) було видалено.
jemmons

Це найясніше пояснення поки. Якщо ви поставите це у відповідь, виграш за вами.
Міхель де Маре

@MichieldeMare Мені було б дивно отримувати винагороду за моє власне запитання ;-) Якщо вам це подобається, ви можете дати нагороду Філіпе Джусті (прийнята відповідь), оскільки він допомагає мені зрозуміти.
jemmons

3
Попередження для людей у ​​майбутньому: Якщо ви вирішите проігнорувати посібник з оновлення Rails та зберегти групу активів у вашому Gemfile, пам’ятайте, що Rails більше не вимагатиме автоматично групи активів під час збирання активів у виробництві. Вам потрібно буде зробити це самостійно, або додати RAILS_GROUPS=assets(див. Rails.groups) Перед командою попереднього компілювання активів у виробництві у вашому середовищі побудови.
Ajedi32

Відповіді:


100

Раніше група активів існувала, щоб уникнути навмисного збирання на вимогу у виробництві. Оскільки Rails 4 вже не веде себе таким чином, має сенс видалити групу активів.

Це пояснюється більш докладно в комітеті, який змінив це. Я витяг декілька цитат із фактичною відповіддю.

Деякі дорогоцінні камені можуть знадобитися (у виробництві), наприклад, кавові рейки, якщо ви використовуєте шаблони для кави та той факт, що зараз активи вже не заздалегідь збираються на вимогу у виробництві.

(не заздалегідь складено на вимогу у виробництві) Означає, що якщо у вас є ці дорогоцінні камені у виробничому середовищі в 3.2.x та забудьте виконати попередню компіляцію, Rails зробить саме те, що робить у процесі розробки, попередньо компілюючи активи, які вимагали. Це вже не вірно в Rails 4, тому якщо ви не попередньо компілюєте активи за допомогою завдань, ви отримаєте 404, коли активи будуть запитами.


32
Чи це також не економило пам’ять? Тепер усі дорогоцінні камені, навіть ті, які не потрібні у "виробництві" (лише в прекомпіляції), завантажені, і таким чином рейли споживають більше пам'яті?
gucki

3
+1 @gucki та час завантаження. Це було моє розуміння груп .. Оскільки вже існував варіант конфігурації, щоб відключити живу компіляцію в будь-якому випадку. Що тут означає "підтримка". afaik мій додаток Rails 3 мав рядок у env / prod.rb, який завантажував активи саме на розробку. Якщо це все, чи можемо ми його все-таки додати?
Karthik T

Група активів видаляється. Раніше дорогоцінні камені всередині активів завантажувались у виробництво, а що робити, якщо вони нам також потрібні у виробництві. Отже, вони повинні бути завантажені у виробництві, а вилучення активів забезпечує це. Активи повинні бути попередньо складені, перш ніж перейти до виробництва.
прашанцяшні

13

Rails 4 намагаються змусити попередньо скласти свої активи до розгортання. Ви повинні попередньо скласти свої активи

$ RAILS_ENV=production bundle exec rake assets:precompile

І чому? Я знайшов це в Посібнику:

За замовчуванням Rails передбачає, що активи були попередньо складені та будуть подані як статичні активи на ваш веб-сервер.

(Джерело: http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

Але багато разів доводиться використовувати ці дорогоцінні камені для активів у виробництві ... наприклад, якщо ви використовуєте файл js.coffee у каталозі переглядів, тоді Rails також потрібен компілятор кави у виробничому режимі.

Тому я здогадуюсь, що причина цієї зміни - покращення продуктивності ... і виглядає також простіше. :)


22
Рейки за умови , що активи були прекомпілірованние є аргументом для підтримки в assetsгрупу, не позбувшись від нього (якщо активи прекомпілірованние, то ці камені не потрібні у виробництві і не повинні бути включені Bundler). І так, можливо, ви б використовували дорогоцінний камінь, як coffee-railsу виробництві ... але так було і в Rails 3, правда? І Rails 3 ставлять coffee-railsу assetsгрупі за замовчуванням. То чому зміна для Rails 4?
Джеммони

1
Чому б ви використовували файл js.coffee у каталозі переглядів? Це має входити в активи / javascripts.
Marnen Laibow-Koser

3

Ми хочемо кофе-скрипт з AJAX ( історія ), тому coffee-railsвиходить з групи активів.
sass-railsпогано поводиться ( історія ), тому він виходить із групи активів.

Вісь групи активів.


2
CoffeeScript не має бути в представленнях. Ви можете зробити Ajax без цього. Вам не потрібно динамічно генерувати JS для того, щоб зробити Ajax. Насправді не слід динамічно генерувати JS. Попередньо компілюйте файли CoffeeScript і уникайте проблеми повністю.
Marnen Laibow-Koser

1
sass-rails погано поводиться, тому що Bundler.require :assetsне працює. Це не обґрунтування для видалення групи активів. Я не хочу therubyracer, libv8 та c. на виробництві, чому це хтось робить? Шаблон кави можна компілювати в шаблон JS, і немає сенсу компілювати його щоразу, коли підміняється нове значення. Немає сенсу брати весь цей тягар на виробництво.
phil pirozhkov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.