Rails4がGemfileの「アセット」グループのサポートをやめた理由


99

Rails 3では、アセットパイプラインでアセットを生成するためだけに使用されるgem 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で新しいプロジェクトを作成すると、アセット関連のGemがデフォルトでグループ外に含まれる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

...

これは、これらのgemがデフォルトで製品ビルドにバンドルされることを意味しますか?もしそうなら、なぜ心の変化ですか?Rails 4は本番環境でのアセットの動的生成に向けて動いていますか?


1
「アセットグループ」の目的や、アセットグループが不要になったRails 4での変更点はまだわかりません。
Michiel de Mare 2013

23
「資産グループ」は人によって異なるものでした。バンドルする必要のない宝石を本番環境に置く場所として使用しました。しかし、受け入れられた回答にリンクされている会話から判断すると、少なくともRailsコアの一部の人々は、プリコンパイルされていないアセットが404でプロダクションに失敗したことを確認する方法としてそれを使用しましたパフォーマンス)。変更されたのは、rails4がアセットを自動生成しないことです。そのため、「アセットグループ」の回避策(railsコアが見たもの)は削除されました。
jemmons 2013年

それはまだ最も明確な説明です。あなたがそれを答えに入れれば、賞金はあなたのものです。
Michiel de Mare 2013

@MichieldeMare私自身の質問に対する報奨金を受け取るのは奇妙だと思います;-)もしあなたがそのように感じるなら、彼が私を理解するのを助けるのに尽力していたので、あなたはフィリペジュスティ(受け入れられた答え)に報奨金を与えることができます。
jemmons 2013年

3
将来の人々への警告:Railsアップグレードガイドを無視してGemfileにアセットグループを保持することを選択した場合、本番環境でアセットをコンパイルするときにRailsがアセットグループを自動的に必要としないことに注意してください。自分で行うか、ビルド環境の運用環境でアセットをプリコンパイルするコマンドの前に追加するRAILS_GROUPS=assets(を参照Rails.groups)必要があります。
Ajedi32 2014

回答:


100

以前は、本番環境での意図しないオンデマンドのコンパイルを回避するために、資産グループが存在していました。Rails 4はそのように動作しないため、アセットグループを削除することは理にかなっています。

これは、それを変更したコミットで詳しく説明されています。実際の答えを引用して引用しました。

コーヒーテンプレートを使用している場合、コーヒーレールのように、(本番環境で)いくつかのGemが必要になる可能性があり、資産が本番環境でオンデマンドでプリコンパイルされなくなったという事実。

(本番環境ではオンデマンドでプリコンパイルされません)3.2.xの本番環境でそのgemがあり、プリコンパイルを忘れた場合、Railsは開発での動作を正確に実行し、要求されたアセットをプリコンパイルします。これはRails 4ではもう当てはまりません。そのため、タスクを使用してアセットをプリコンパイルしないと、アセットがリクエストのときに404が返されます。


32
メモリも節約できたのでは?これで、「プロダクション」(プリコンパイルでのみ)で必要ないものも含め、すべてのgemがロードされ、railsがより多くのメモリを消費しますか?
gucki 2013

3
+1 @guckiと読み込み時間。これはグループについての私の理解でした。.とにかくライブコンパイルを無効にする設定オプションがすでにあったためです。ここで「サポート」とは何を意味します。私のRails 3アプリには、開発時にアセットをロードするenv / prod.rbの行がありました。それがすべてなら、とにかくそれを追加できますか?
Karthik T 2014

資産グループが削除されます。以前はアセット内の宝石がプロダクションにロードされていましたが、今度はそれらもプロダクションで必要な場合はどうでしょうか。したがって、それらは本番環境でロードする必要があります。アセットグループを削除すると、それが保証されます。本番環境に移行する前に、アセットをプリコンパイルする必要があります。
prashantsahni

13

Rails 4は、デプロイ前にアセットをプリコンパイルするように強制しようとします。アセットをプリコンパイルする必要があります

$ RAILS_ENV=production bundle exec rake assets:precompile

なぜ?私はガイドでこれを見つけました:

デフォルトでは、Railsはアセットがプリコンパイルされており、Webサーバーによって静的アセットとして提供されることを想定しています。

(出典:http : //edgeguides.rubyonrails.org/asset_pipeline.html#in-production

しかし、多くの場合、これらの「アセット」gemをプロダクションで使用する必要があります...たとえば、viewsディレクトリでjs.coffeeファイルを使用する場合、Railsにはプロダクションモードのコーヒーコンパイラも必要です。

したがって、この変更の理由は、パフォーマンスの向上であると思います。:)


22
アセットがプリコンパイルされていると想定しているRailsは、グループを削除せずにグループを維持するための引数ですassets(アセットがプリコンパイルされている場合、これらのgemは本番環境では不要であり、バンドラーに含めるべきではありません)。ええ、多分あなたはcoffee-railsプロダクションのような宝石を使うでしょう...しかし、それはRails 3でもそうでしたね?そしてデフォルトcoffee-railsでは、Rails 3がassetsグループに追加しました。では、なぜRails 4の変更なのでしょうか。
jemmons 2013年

1
ビューディレクトリでjs.coffeeファイルを使用するのはなぜですか?それはassets / javascriptsに入るはずです。
Marnen Laibow-Koser 2014

3

AJAX(ヒストリ)を含むcoffeescriptが必要なのでcoffee-rails、アセットグループから移動します。
sass-rails誤動作(履歴)があるため、アセットグループの外に移動します。

資産グループを斧ます。


2
CoffeeScriptをビューに含めないでください。それがなくてもAjaxを実行できます。Ajaxを実行するために、JSを動的に生成する必要はありません。実際、JSを動的に生成するべきではありません。CoffeeScriptファイルをプリコンパイルし、問題を完全に回避します。
Marnen Laibow-Koser 2014

1
Bundler.require :assetsが実行されていないため、sass-railsは正しく動作しません。これは、アセットグループを削除する理由にはなりません。therubyracer、libv8などは必要ありません。生産上、なぜ誰かが行うのですか?コーヒーテンプレートはJSテンプレートにコンパイルでき、新しい値が代入されるたびにコンパイルする必要はありません。このすべての負担を生産に費やしても意味がありません。
phil pirozhkov 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.