为什么Rails4在Gemfile中放弃对“资产”组的支持

在Rails 3中,专门用于在资产pipe道中生成资产的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创build一个新项目会产生一个Gemfile,其中包含与任何组之外的默认资产相关的gem文件:

 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是否正朝着生产资产的dynamic生成迈进?

此前,资产组的存在是为了避免意外的按需生产。 由于Rails 4的行为不再那样,移除资产组是有道理的。

在提交中更详细地解释了这一点。 我用实际的答案提取了一些引号。

如果你使用的是咖啡模板,一些gem可能需要(在生产中)像咖啡栏一样,事实上,现在资产在生产中不需要预编译。

(在生产环境中不需要预先编译)意味着如果你在3.2.x的生产环境中拥有那些gem,并且忘记了预编译,那么Rails将完成它在开发中所做的事情,预编译所请求的资源。 在Rails 4中这不是真的,所以如果你不使用任务预编译资产,当资产请求时你将得到一个404。

Rails 4尝试强制您在部署之前预编译您的资产。 你必须预先编译你的资产

 $ RAILS_ENV=production bundle exec rake assets:precompile 

为什么? 我在指南中find了这个:

默认情况下,Rails假定资源已经被预编译,并且会被Web服务器当作静态资源。

(来源: http : //edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

但是很多时候,您必须在生产环境中使用这些“资产”gem…例如,如果您在视图目录中使用js.coffee文件,那么Rails也需要在生产模式下使用咖啡编译器。

所以我想,这个变化的原因是性能改善…而且看起来更简单。 🙂

我们想要AJAX( 历史 )的coffee-rails脚本,所以coffee-rails移出资产组。
sass-rails行为不当( 历史 ),所以它移出资产组。

Ax资产组。