100

Rails 3 では、アセット パイプラインでアセットを生成するためにのみ使用される gemassetsは、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 は本番環境でアセットを動的に生成する方向に進んでいますか?

4

3 に答える 3

100

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

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

コーヒー テンプレートを使用している場合は、Coffee-Rails のようないくつかの gem が (本番環境で) 必要になる可能性があります。

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

于 2013-06-20T18:36:49.557 に答える
13

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

$ RAILS_ENV=production bundle exec rake assets:precompile

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

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

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

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

ですから、この変更の理由はパフォーマンスの向上だと思います...そして見た目もシンプルです。:)

于 2013-05-07T13:49:50.333 に答える
3

AJAX ( history ) を使用したcoffeescript が必要なためcoffee-rails、assets グループから移動します。
sass-rails不正な動作 ( history ) であるため、資産グループから移動します。

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

于 2013-06-20T23:25:20.367 に答える