Почему Rails4 отказался от поддержки группы «assets» в 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, что сделало группу ресурсов ненужной.
Michiel de Mare
23
«Группа активов» была разной для разных людей. Я использовал его как место для размещения драгоценных камней, которые мне не нужно было связывать при производстве. Но, судя по разговору, связанному с принятым ответом, по крайней мере, некоторые люди в ядре rails использовали его как способ убедиться, что некомпилированные предварительно скомпилированные активы не работают с 404 в производстве (вместо тихой автогенерации, что приведет к плохому производительность). Что изменилось, так это то, что rails4 больше не генерирует ресурсы автоматически, поэтому обходной путь "группы ресурсов" (как это было видно в ядре rails) был удален.
jemmons
Это самое ясное объяснение. Если вы укажете это в ответе, награда будет за вами.
Michiel de Mare
@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?
jemmons
1
Зачем вам использовать файл js.coffee в каталоге просмотров? Это должно быть в assets / javascripts.
Marnen Laibow-Koser
3

Нам нужен coffeescript с AJAX ( история ), поэтому мы coffee-railsвыходим из группы ресурсов.
sass-railsплохо себя ведет ( история ), поэтому он перемещается из группы активов.

Осмотрите группу активов.

mockturtl
источник
2
CoffeeScript не должен быть в представлениях. Вы можете использовать Ajax и без этого. Вам не нужно динамически генерировать JS, чтобы использовать Ajax. Фактически, вы не должны динамически генерировать JS. Предварительно скомпилируйте файлы CoffeeScript и полностью избегайте этой проблемы.
Marnen Laibow-Koser
1
sass-rails плохо себя ведет, потому что Bundler.require :assetsне запускается. Это не повод для удаления группы активов. Мне не нужен Rubyracer, libv8 и т. Д. на производстве, почему кто-то делает? Шаблон Coffee можно скомпилировать в шаблон JS, и нет смысла компилировать его каждый раз, когда подставляется новое значение. Нет смысла брать всю эту ношу на продакшн.
Фил Пирожков