如何让Rails 3资产更快地预编译?

时间:2012-02-15 14:02:09

标签: ruby-on-rails ruby deployment asset-pipeline ruby-on-rails-3.2

我有一个正在运行的Rails 3.2.1应用程序,我正在通过Capistrano部署deploy/assets运行deploy:assets:precompile任务。

一切正常,但编译本身非常慢。我没有那么多CSS和JavaScript(总共大约8200行)。

编译资产通常需要大约1-3分钟,大约占整个部署时间的90%。

有没有办法优化这个?也许使用不同的程序来编译资产或以某种方式优化它?

我正在Linode 512上运行应用程序1.9.2-p290,Rails 3.2.1并使用therubyracer gem如果有任何相关性。

2 个答案:

答案 0 :(得分:21)

这不是让它运行得更快的答案,但就“不同的程序”而言,你可以告诉Capistrano只在你对资产进行任何更改时才预编译资产。您可能希望执行类似这样的自定义assets:precompile任务,该任务将查看现有代码和新部署代码之间的git日志。对我来说,这很有效,现在我只需要在更新资产时处理缓慢的部署:

namespace :deploy do
  namespace :assets do
    task :precompile, :roles => :web, :except => { :no_release => true } do
      from = source.next_revision(current_revision)
      if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
        run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
      else
        logger.info "Skipping asset pre-compilation because there were no asset changes"
      end
    end
  end
end

来源:http://www.bencurtis.com/2011/12/skipping-asset-compilation-with-capistrano/

答案 1 :(得分:16)

我刚刚编写了一个gem来解决Rails中的这个问题,称为turbo-sprockets-rails3。它只通过重新编译已更改的文件来加速assets:precompile,并且只编译一次以生成所有资产。它开箱即用于Capistrano,因为您的资产目录在版本之间共享。

如果你可以帮助我测试turbo-sprockets-rails3宝石,那就太棒了,如果你有任何问题请告诉我。

相关问题