2012-03-16 42 views
14

在我的dev的沙箱耙資產:預編譯採取非常長時間才能完成

RAILS_ENV=production rake assets:precompile 

接管了4分鐘完成。這是正常的嗎?在heroku上,這項工作需要10分鐘以上,有時會超時。有什麼辦法可以檢測這個和/或加快速度嗎?

UPDATE

我異形VS CSS

3.7 s  js 
175 s   css 

的數字是通過插在這裏

---------------------- 
/Users/bradphelan/.rvm/gems/[email protected]/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 

---------------------- 
    /Users/bradphelan/.rvm/gems/[email protected]/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 
取得彙編JS階段

timeit調用增加位做定時

def timeit context 
    s = Time.now 
    yield.tap do 
    e = Time.now 
    d = e - s 
    puts "#{d*1000}\t #{context}" 
    end 
end 
+0

這裏有幾件事情我在提高性能的發現......並非真正的答案;更像是一些指針:[1]:http://stackoverflow.com/questions/9546831/rake-assetsprecompile-is-slooooow-any-way-to-speed-it-up [2]:http:// stackoverflow問題:8568786/rake-poorly-performance-pre-preprecile [3]:http://www.ruby-forum.com/topic/2538285 – ScottJShea 2012-03-16 16:15:56

+0

實際上,其中一個鏈接看起來像是一個可能的候選人。我懷疑Rails應用程序多次被加載。 http://www.ruby-forum.com/topic/2538285#1026719 – bradgonesurfing 2012-03-16 19:47:35

+0

噢,很好......我擔心我的回答會如此寬泛以至於很煩人。 – ScottJShea 2012-03-16 19:49:23

回答

3

的hackety黑客的解決方案似乎是猴子修補標準SASS壓縮引擎的出路。我說這個我application.rb中

module Sass 
    module Rails 
    class CssCompressor 
     def compress(css) 
     css 
     end 
    end 
    end 
end 

頂部的文件大小的差異是124K猴子補丁之前和之後,125K和級的速度提高一個數量級。

+0

而且,heroku資產的建造時間縮短到52秒,但仍然超過15分鐘。 – bradgonesurfing 2012-03-16 22:55:09

+3

對Ruby 1.9.3和Rails 3.2.1沒有幫助 – Paul 2012-07-17 17:41:55

+0

對Ruby 2 Rails 4也沒有幫助。 – 2014-01-09 14:17:13

1

最好的選擇是在本地編譯,提交和部署正常,禁用生產的預編譯任務。我現在正在爲我的所有生產應用程序執行此操作。

爲了解決在開發模式下服務的編譯資產(覆蓋動態流水線編譯,您需要)執行以下操作。

在development.rb地方下面的行:

config.assets.prefix = "/dev-assets" 

該過乘坐任何設置在application.rb中(通常是 「/資產」)。

你還需要這application.rb中:

config.assets.initialize_on_precompile = false 

即停止嘗試連接到數據庫的任務。 (注意,如果你在你的資產中引用ActiveRecord模型,這是行不通的)。

這些更改允許您在本地編譯資源並將其提交到您的資源庫,並將這些文件放在工作開發樹中,但是仍然會將開發請求發送到Sprockets。另外,當事情真的發生變化時,你只需要預編譯和提交。

參考my blog post

+0

請閱讀評論和詳情。 CSS壓縮器存在一個問題,需要很長時間在本地編譯或在生產中編譯。 – bradgonesurfing 2012-03-17 08:22:48

5

我on Rails的3.2.13 - 我與CSS壓縮走非常長的時間同樣的問題。要解決:

在Gemfile中添加:

gem 'yui-compressor' 

在配置/環境/ production.rb:

config.assets.css_compressor = :yui 
config.assets.js_compressor = :yui 

耙資產:預編譯沒有這些變化:325秒

耙資產:預編譯這些更改:79秒

耙資產:預編譯沒有壓縮:45秒

+0

這不適合我。時間大致相同,大約6分鐘! – 2013-06-20 15:21:00

+0

你確定你在生產模式下預編譯? – 2013-06-20 19:51:51

+0

我正在使用capistrano。我很確定。 – 2013-07-03 17:33:53