2012-03-16 39 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