rake assets:预编译需要很长时间才能完成

bra*_*ing 14 performance precompile ruby-on-rails-3.1 asset-pipeline

在我的开发沙箱中

RAILS_ENV=production rake assets:precompile
Run Code Online (Sandbox Code Playgroud)

需要4分钟才能完成.这是正常的吗?在heroku上花费超过10分钟来完成这项工作,有时会超时.有没有办法解决这个问题和/或加快速度?

UPDATE

我分析了编译的CSS和JS阶段

3.7 s        js
175 s            css
Run Code Online (Sandbox Code Playgroud)

这些数字是通过这里的仪器制作的

----------------------
/Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
----------------------
266     # Assign a compressor to run on `application/javascript` assets.
267     #
268     # The compressor object must respond to `compress` or `compile`.
269     def js_compressor=(compressor)
270       expire_index!
271  
272       unregister_bundle_processor 'application/javascript', :js_compressor
273       return unless compressor
274  
275       register_bundle_processor 'application/javascript', :js_compressor do |context, data|
276  
277         timeit "js" do
278           compressor.compress(data)
279         end
280  
281       end
282     end
Run Code Online (Sandbox Code Playgroud)

    ----------------------
    /Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
    ----------------------
    241  
    242     # Assign a compressor to run on `text/css` assets.
    243     #
    244     # The compressor object must respond to `compress` or `compile`.
    245     def css_compressor=(compressor)
    246       expire_index!
    247  
    248       unregister_bundle_processor 'text/css', :css_compressor
    249       return unless compressor
    250  
    251       register_bundle_processor 'text/css', :css_compressor do |context, data|
    252         timeit "css" do
    253           compressor.compress(data)
    254         end
    255       end
    256     end
Run Code Online (Sandbox Code Playgroud)

timeit调用增加位做计时

def timeit context
  s = Time.now
  yield.tap do 
    e = Time.now
    d = e - s
    puts "#{d*1000}\t #{context}"
  end
end
Run Code Online (Sandbox Code Playgroud)

Yon*_*ciu 5

我在Rails 3.2.13上 - 我遇到了与css压缩相同的问题需要很长时间.修理:

在Gemfile中添加:

gem 'yui-compressor'
Run Code Online (Sandbox Code Playgroud)

在config/environments/production.rb中:

config.assets.css_compressor = :yui
config.assets.js_compressor = :yui
Run Code Online (Sandbox Code Playgroud)

rake资产:没有这些更改的预编译:325秒

rake资产:使用这些更改进行预编译:79秒

rake资产:没有压缩的预编译:45秒


bra*_*ing 3

hackety hack 解决方案似乎是对标准 sass 压缩引擎进行猴子修补。我将其添加到我的 application.rb 的顶部

module Sass
  module Rails
    class CssCompressor
      def compress(css)
        css
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

猴子补丁之前的文件大小差异为 124k,之后的文件大小差异为 125k,速度提高了一个数量级。

  • 对 Ruby 1.9.3 和 Rails 3.2.1 没有帮助 (3认同)