为什么Rails4放弃了对Gemfile中"assets"组的支持

jem*_*ons 96 asset-pipeline ruby-on-rails-4

在Rails 3中,专门用于在资产管道中生成资产的gem被正确放置在assetsGemfile 的组中:

...

# 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
Run Code Online (Sandbox Code Playgroud)

现在,根据(仍在进行中)升级文档:

Rails 4.0从Gemfile中删除了资产组.升级时,您需要从Gemfile中删除该行.

果然,使用RC1创建一个新项目会生成一个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

...
Run Code Online (Sandbox Code Playgroud)

这是否意味着这些宝石现在默认捆绑在生产版本中?如果是这样,为什么改变心意?Rails 4是否正朝着生产中动态生成资产的方向发展?

Fil*_*sti 97

以前,资产组织的存在是为了避免生产中出现意外的按需编译.由于Rails 4不再那样,因此删除资产组是有意义的.

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

如果您正在使用咖啡模板,那么可能需要一些宝石(在生产中),如咖啡轨道,以及现在资产不再按生产需求进行预编译.

(没有在生产中根据需要进行预编译)意味着如果你在3.2.x的生产环境中拥有那些宝石并忘记预编译,那么Rails将完全按照它在开发中的做法,预编译所请求的资产.这在Rails 4中不再适用,因此如果您不使用任务预编译资产,那么当资产是请求时,您将获得404.

  • 是不是也节省了记忆?现在所有的宝石,甚至那些"生产"中不需要的宝石(仅在预编译中)都被加载,因此rails会消耗更多的内存? (32认同)
  • +1 @gucki和加载时间.这是我对组的理解..因为已经有一个配置选项来禁用实时编译.什么"支持"相当于这里.afaik我的Rails 3应用程序在env/prod.rb中有一行,只在开发时加载资产.如果这就是全部,我们还能添加它吗? (3认同)

Zol*_*tan 13

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

$ RAILS_ENV=production bundle exec rake assets:precompile
Run Code Online (Sandbox Code Playgroud)

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

默认情况下,Rails假定资产已经过预编译,并且将由Web服务器作为静态资产提供.

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

但很多时候你必须在生产中使用这些'资产'宝石......例如,如果你在views目录中使用js.coffee文件,那么Rails也需要在生产模式下使用咖啡编译器.

所以我想,这种变化的原因是性能提升......而且看起来也更简单.:)

  • 假设资产已被预编译的Rails是*保持*资产`组的论据,而不是去除它(如果资产是预编译的,那么生产中不需要这些宝石,捆绑器不应包含这些宝石).是的,也许你会在生产中使用像'coffee-rails`这样的宝石......但Rails 3也是如此,对吧?并且Rails 3默认将`coffee-rails`放在`assets`组中.那么为什么改变Rails 4呢? (22认同)