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

时间:2013-05-06 19:55:20

标签: asset-pipeline ruby-on-rails-4

在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

现在,根据(仍在进行中)upgrade documentation

  

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

果然,使用RC1制作一个新项目会产生一个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

...

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

3 个答案:

答案 0 :(得分:97)

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

the commit更详细地解释了这一点。我用实际答案提取了一些引号。

  

如果您使用咖啡模板,可能需​​要(生产中)一些宝石,如咖啡轨   现在资产不再按生产需求进行预编译了。

     

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

答案 1 :(得分:13)

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

预编译资产
$ RAILS_ENV=production bundle exec rake assets:precompile

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

  

默认情况下,Rails假定资产已经过预编译,并且会被预编译   由您的网络服务器充当静态资产。

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

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

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

答案 2 :(得分:3)

我们希望coffeescript使用AJAX(history),因此coffee-rails移出资产组。
sass-rails行为不端(history),因此它会移出资产组。

资产资产组。