在capistrano部署之前,在开发计算机上进行资产预编译

时间:2011-11-24 14:06:42

标签: ruby-on-rails-3.1 capistrano asset-pipeline

我希望资产预编译在我的开发机器上发生,因为capistrano对代码进行了打包(tar ball),并且已将预编译资产包含在最终部署包中。

当我尝试内置的capistrano食谱时 它运行load 'deploy/assets'  <{1}}在服务器上。

我正在寻找这个的原因是因为目前预编译在我的EC2微实例上花了太长时间(有时候只是挂起), 如果资产编译甚至可以在部署开始之前完成,那么我可以将服务器从这个繁重的工作负载中保存下来 - 直到至少我有更好的配置服务器可用。

3 个答案:

答案 0 :(得分:3)

目前工作流程仍然有点颠簸,但您可能会发现使用Guard-Rails-Assets取得了一些成功。这有点慢,特别是如果你进行了大量的资产更改,但它会在更改后编译资产,你可以将它们检入你的仓库以便稍后部署。

答案 1 :(得分:3)

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

如果你可以帮助我测试turbo-sprockets-rails3宝石,真的很棒,如果你有任何问题,请告诉我。

答案 2 :(得分:1)

load 'deploy/assets'Capfile移除config/deploy.rb,并将以下行添加到config/deploy.rb

set :assets_role, [ :web, :app ]
set :normalize_asset_timestamps, false
set :assets_tar_path, "#{release_name}-assets.tar.gz"

before "deploy:update" do
  run_locally "rake assets:precompile"
  run_locally "cd public; tar czf #{Dir.tmpdir}/#{assets_tar_path} assets"
end

before "deploy:finalize_update", :roles => assets_role, :except => { :no_release => true } do
  upload "#{Dir.tmpdir}/#{assets_tar_path}", "#{shared_path}/#{assets_tar_path}"
  run "cd #{shared_path}; /bin/tar xzf #{assets_tar_path}"
  run "/bin/ln -s #{shared_path}/assets #{release_path}/public"
  run "/bin/rm #{shared_path}/#{assets_tar_path}"
end

如果您使用turbo-sprockets-rails3,请将其添加到最后一个块:

  run "cd #{release_path}; #{rake} assets:clean_expired 2> /dev/null"