web-dev-qa-db-ja.com

Rails4がGemfileの「assets」グループのサポートを削除した理由

Rails 3、アセットパイプラインでアセットを生成するために排他的に使用されるgemは、Gemfileのassetsグループに適切に配置されました。

...

# 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は、実稼働環境での資産の動的生成に向かっていますか?

96
jemmons

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

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

コーヒーテンプレートを使用している場合、コーヒーレールのようないくつかの宝石が(生産中に)必要になる可能性があり、資産は生産中にオンデマンドでプリコンパイルされなくなりました。

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

97
Filipe Giusti

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は本番モードでcoffeeコンパイラが必要です同様に。

だから私は、この変更の理由はパフォーマンスの改善であると推測します...そして同様にもっとシンプルに見えます。 :)

13
Zoltan

AJAX( history )でcoffeescriptが必要なので、coffee-Railsは資産グループから移動します。
sass-Railsは誤動作( history )であるため、資産グループから移動します。

資産グループをAします。

3
mockturtl