【问题标题】:rake assets:precompile taking extremely long to completerake assets:预编译需要很长时间才能完成
【发布时间】:2012-04-02 03:17:23
【问题描述】:

在我的开发沙箱中

RAILS_ENV=production rake assets:precompile

需要 4 多分钟才能完成。这正常吗。在 heroku 上,完成这项工作需要 10 多分钟,有时会超时。有什么办法可以剖析和/或加快速度吗?

更新

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

3.7 s        js
175 s            css

这些数字是通过在这里检测得到的

----------------------
/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

    ----------------------
    /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

timeit 调用是进行计时的附加位

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

【问题讨论】:

  • 以下是我在提高性能方面发现的一些事情……并不是真正的答案;更像是一些指针:[1]:stackoverflow.com/questions/9546831/… [2]:stackoverflow.com/questions/8568786/… [3]:ruby-forum.com/topic/2538285
  • 实际上其中一个链接看起来很可能。我怀疑 Rails 应用程序以某种方式被多次加载。 ruby-forum.com/topic/2538285#1026719
  • 哦,太好了...我担心我的回答会过于宽泛以至于令人讨厌。
  • 设置 config.assets.compress = false 将我的开发机器上的编译时间降低到 40 秒。所以javascript压缩需要3分20秒。我们这里没有编译 boost C++ 库!!
  • 我认为这不是答案。我的意思是我仍然想要压缩。花费这么长时间需要修复而不是关闭该功能。

标签: performance ruby-on-rails-3.1 asset-pipeline precompile


【解决方案1】:

我在 Rails 3.2.13 上 - 我遇到了同样的问题,css 压缩需要很长时间。修复:

在 Gemfile 中添加:

gem 'yui-compressor'

在 config/environments/production.rb 中:

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

rake assets:预编译没有这些更改:325 秒

rake assets:预编译这些更改:79 秒

rake assets:无压缩预编译:45 秒

【讨论】:

  • 这对我不起作用。时间大致相同,大约 6 分钟!
  • 你确定你是在生产模式下预编译的吗?
  • 我使用的是 capistrano。我很确定。
  • 我更新了我的答案以包括 config.assets.js_compressor = :yui 这有很大的不同
  • 谢谢。我尝试了config.assets.js_compressor = :yui,我的 capistrano 部署过程从 4 分钟缩短到了大约 45 秒。
【解决方案2】:

hacky hack 解决方案似乎是对标准 sass 压缩引擎进行猴子补丁。我将此添加到我的应用程序的顶部。rb

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

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

【讨论】:

  • heroku 资产构建时间缩短到 52 秒,这仍然很糟糕,但比 15 分钟要好。
  • 对 Ruby 1.9.3 和 Rails 3.2.1 没有帮助
【解决方案3】:

最好的选择是在本地编译,正常提交和部署,禁用生产环境的预编译任务。我现在正在为我所有的生产应用程序这样做。

要绕过那些在开发模式下提供的已编译资产(覆盖您需要的动态管道编译),请执行以下操作。

在 development.rb 中放置以下行:

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

这会覆盖 application.rb 中设置的任何内容(通常是“/assets”)。

你在 application.rb 中也需要这个:

config.assets.initialize_on_precompile = false

这会阻止尝试连接到您的数据库的任务。 (如果您在资产中引用 ActiveRecord 模型,请注意,因为这不起作用)。

这些更改允许您在本地编译资产并将其提交到您的存储库,并将这些文件保存在您的工作开发树中,但开发请求仍会发送到 Sprockets。此外,您只需在实际发生更改时进行预编译和提交。

参考my blog post

【讨论】:

  • 请阅读 cmets 和详细信息。 CSS 压缩器存在问题,无论是在本地编译还是在生产环境中编译都需要很长时间。
【解决方案4】:

使用这个答案,我们获得了数量级的加速:

EXECJS_RUNTIME='Node' JRUBY_OPTS="-J-d32 -X-C" RAILS_ENV=development bundle exec rake war

http://avinmathew.com/improving-rails-asset-precompile-times-on-jruby/

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2016-07-30
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多