为什么Rails4在Gemfile中放弃对“资产”组的支持
在Rails 3中,专门用于在资产pipe道中生成资产的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
现在,根据(仍在进行中) 升级文档 :
Rails 4.0从Gemfile中删除资产组。 升级时,您需要从Gemfile中删除该行。
果然,使用RC1创build一个新项目会产生一个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是否正朝着生产资产的dynamic生成迈进?
此前,资产组的存在是为了避免意外的按需生产。 由于Rails 4的行为不再那样,移除资产组是有道理的。
在提交中更详细地解释了这一点。 我用实际的答案提取了一些引号。
如果你使用的是咖啡模板,一些gem可能需要(在生产中)像咖啡栏一样,事实上,现在资产在生产中不需要预编译。
(在生产环境中不需要预先编译)意味着如果你在3.2.x的生产环境中拥有那些gem,并且忘记了预编译,那么Rails将完成它在开发中所做的事情,预编译所请求的资源。 在Rails 4中这不是真的,所以如果你不使用任务预编译资产,当资产请求时你将得到一个404。
Rails 4尝试强制您在部署之前预编译您的资产。 你必须预先编译你的资产
$ RAILS_ENV=production bundle exec rake assets:precompile
为什么? 我在指南中find了这个:
默认情况下,Rails假定资源已经被预编译,并且会被Web服务器当作静态资源。
(来源: http : //edgeguides.rubyonrails.org/asset_pipeline.html#in-production )
但是很多时候,您必须在生产环境中使用这些“资产”gem…例如,如果您在视图目录中使用js.coffee文件,那么Rails也需要在生产模式下使用咖啡编译器。
所以我想,这个变化的原因是性能改善…而且看起来更简单。 🙂
我们想要AJAX( 历史 )的coffee-rails
脚本,所以coffee-rails
移出资产组。
sass-rails
行为不当( 历史 ),所以它移出资产组。
Ax资产组。
- build立一个窗口pipe理器
- 如果`malloc(0)`返回一个非空指针,我可以把它传递给`free`吗?
- 在shellpipe道中捕获错误代码
- Python中的进程间通信
- pipe道命令输出到tee,但也保存命令的退出代码
- Visual Studio 2010编译与debugging或发行版本的第三方库,取决于如果我的项目正在编译构build或发布?
- 哪个是最好的git托pipesw? – Gitolite vs. Gitlab vs. Gitorius
- 什么“编译时分配的内存”真的意味着什么?
- DownloadManager.Request.setNotificationVisibility失败,并显示jSecurityException:无效值:2