2011-11-24 84 views
4

我希望资产预编译发生在我的开发机器上,而且代码被capistrano打包(tar ball'ed),并且已将预编译的资产包含在最终部署包中。Capistrano部署之前开发机器上的资产预编译

当我尝试在 load 'deploy/assets'内置的Capistrano的配方,多数民众赞成它运行 rake RAILS_GROUPS=assets assets:precompile在服务器上。

我寻找这个的原因是因为此时预编译在我的EC2微实例上花费太长时间(并且有时只是挂起), 如果资产编译甚至可以在部署之前完成开始,这样我就可以将服务器从这种繁重的工作负载中拯救出来 - 直到至少我有更好的配置服务器可用。

回答

3

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

+0

这听起来像一个合理的方法:) – thanikkal

3

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

如果您可以帮助我测试turbo-sprockets-rails3宝石,并且让我知道您是否有任何问题,那将会非常棒。

+0

+1弥敦道,这确实是伟大的工作。一定会把它添加到我的项目中,让你知道。然后可能会考虑切换接受的答案:) – thanikkal

+0

弥敦道,这不适合我。我一直得到“未定义的方法摘要”为nil:NilClass“,您是否希望我提供任何细节以便我们能够指出这一点?我将在github上提交问题 – thanikkal

+0

Hi @thanikkal,感谢您的反馈!请更新宝石到最新版本,然后重试,我认为它应该是固定的。 – ndbroadbent

1

Capfileconfig/deploy.rb删除load 'deploy/assets',并添加以下行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"