在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是否正朝着生产中动态生成资产的方向发展?
答案 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)