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


99

在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

...

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


1
我仍然不知道“资产组”的目的是什么,以及在Rails 4中发生了哪些变化,从而使资产组不再需要。
米歇尔·德·马雷2013年

23
对于不同的人来说,“资产组”是不同的东西。我用它来放置不需要在生产中捆绑的宝石。但是,从与接受的答案相关的对话来看,至少有一些处于Rails核心的人使用它作为确保非预编译资产在生产404时失败的方式(而不是默默地自动生成,这会导致不良后果)性能)。变化的是Rails4不再自动生成资产,因此“资产组”解决方法(如Rails核心所见)已被删除。
jemmons

这是最清楚的解释。如果您将其放在答案中,则赏金属于您。
Michiel de Mare

@MichieldeMare对于我自己的问题,我会感到很奇怪;-)如果您愿意,可以将奖金提供给Filipe Giusti(公认的答案),因为他有助于我理解。
jemmons 2013年

3
未来对人们的警告:如果您选择忽略Rails升级指南并将资产组保留在Gemfile中,请记住,Rails在编译生产中的资产时将不再自动要求资产组。您要么需要自己做,要么在命令之前添加RAILS_GROUPS=assets(请参阅Rails.groups参考资料)以在构建环境中预编译生产中的资产。
Ajedi32

Answers:


100

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

在更改了该内容的提交中对此进行了更详细说明。我用实际答案提取了一些引号。

如果您使用的是咖啡模板,则可能需要(生产中的)一些宝石,例如咖啡架,并且事实是现在不再按需在生产中预编译资产。

(不是在生产中按需进行预编译的)意味着,如果在3.2.x的生产环境中拥有该gems并忘记进行预编译,则Rails将完全按照其在开发中的工作进行操作,并预编译所请求的资产。在Rails 4中不再是这样,因此,如果您不使用任务对资产进行预编译,则在请求资产时将获得404。


32
这还节省内存吗?现在所有宝石,即使是“生产”中不需要的宝石(仅在预编译中)都已加载,因此rails会占用更多内存吗?
gucki

3
+1 @gucki和加载时间。这是我对这些组的理解。.由于已经有了一个配置选项,无论如何都禁用实时编译。“支持”在这里意味着什么。afaik我的Rails 3应用程序在env / prod.rb中有一行内容,它仅在开发中加载资产。如果仅此而已,我们还能添加它吗?
Karthik T 2014年

资产组已删除。早先资产中的宝石已投入生产,如果现在在生产中也需要它们,该怎么办。因此,它们应该在生产中担负重担,确保资产组的移走。必须先对资产进行预编译,然后才能投入生产。
prashantsahni

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编译器。

因此,我猜想,此更改的原因是性能提高……并且看起来也更加简单。:)


22
Rails假设资产已经过预编译,这是保留assets小组而不是摆脱它的一个理由(如果资产是预编译的,那么在生产中就不需要这些gems,并且捆绑软件也不应将其包含在内)。是的,也许您会coffee-rails在生产中使用类似的宝石……但是在Rails 3中也是如此。默认情况下,Rails 3放在coffee-railsassets组中。那么,为什么要更改Rails 4?
jemmons,

1
为什么要在views目录中使用js.coffee文件?那应该放在资产/ javascript中。
Marnen Laibow-Koser 2014年

3

我们想要带有AJAX(历史记录)的coffeescript ,因此coffee-rails将其移出资产组。
sass-rails行为不当(历史),因此将其移出资产组。

砍下资产组。


2
CoffeeScript不应显示在视图中。您可以不这样做而做Ajax。您不需要为了生成Ajax而动态生成JS。实际上,您不应该动态生成JS。预编译CoffeeScript文件,并完全避免出现此问题。
Marnen Laibow-Koser 2014年

1
sass-rails行为异常,因为Bundler.require :assets未运行。这并不是删除资产组的理由。我不想要therubyracer,libv8等。在生产上,为什么有人要这么做?Coffee模板可以编译为JS模板,并且每次替换一个新值时都没有必要对其进行编译。把所有这些负担带到生产上是没有意义的。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.