100

在 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

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

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

...

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

4

3 回答 3

100

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

这在更改它的提交中进行了更详细的解释。我提取了一些带有实际答案的引号。

如果您正在使用咖啡模板,则可能需要一些 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...例如,如果你在你的views目录中使用一个js.coffee文件,那么Rails也需要在生产模式下使用coffee编译器。

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

于 2013-05-07T13:49:50.333 回答
3

我们想要使用 AJAX(历史)的咖啡脚本,因此coffee-rails从资产组中移出。
sass-rails行为不端(历史),因此它移出资产组。

砍掉资产组。

于 2013-06-20T23:25:20.367 回答