Ruby on rails 3.1 capistrano部署前在开发计算机上预编译资产
我希望在capistrano打包(tar ball'ed)代码并将预编译的资产包含在最终部署包中之前,在我的开发机器上进行资产预编译 当我尝试内置的capistrano配方时Ruby on rails 3.1 capistrano部署前在开发计算机上预编译资产,ruby-on-rails-3.1,capistrano,asset-pipeline,Ruby On Rails 3.1,Capistrano,Asset Pipeline,我希望在capistrano打包(tar ball'ed)代码并将预编译的资产包含在最终部署包中之前,在我的开发机器上进行资产预编译 当我尝试内置的capistrano配方时 加载“部署/资产”它运行 rake RAILS\u GROUPS=assets-assets:precompile在服务器上 我之所以寻找它,是因为目前我的EC2微实例上的预编译时间太长(有时只是挂起), 如果在部署开始之前就可以完成资产编译,这样我就可以将服务器从繁重的工作负载中解救出来,直到至少我有更好的服务器可用。目
加载“部署/资产”
它运行
rake RAILS\u GROUPS=assets-assets:precompile
在服务器上
我之所以寻找它,是因为目前我的EC2微实例上的预编译时间太长(有时只是挂起),
如果在部署开始之前就可以完成资产编译,这样我就可以将服务器从繁重的工作负载中解救出来,直到至少我有更好的服务器可用。目前的工作流程仍然有点颠簸,但您可能会发现使用它会取得一些成功。这有点慢,特别是当您进行大量资产更改时,但是当资产更改时,它会编译资产,您可以将它们签入到您的repo中,以便稍后部署。我刚刚编写了一个gem来解决Rails内部的这个问题,名为。它只需重新编译更改的文件,只需编译一次即可生成所有资产,从而加快了
资产的预编译速度。它适用于Capistrano,因为您的资产目录在不同版本之间共享
如果您能帮助我测试gem,并告诉我您是否有任何问题,那将是非常棒的。从Capfile
或config/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
set:assets\u角色,[:web,:app]
设置:规格化\u资产\u时间戳,false
set:assets_tar_path,“#{release_name}-assets.tar.gz”
在“部署:更新”之前
本地运行“rake资产:预编译”
在本地运行“cd public;tar czf{Dir.tmpdir}/{assets\u tar_path}assets”
结束
在“deploy:finalize\u update”之前:roles=>assets\u role,:except=>{:no\u release=>true}do
上传“#{Dir.tmpdir}/#{assets_tar_path}”,“#{shared_path}/#{assets_tar_path}”
运行“cd{shared\u path};/bin/tar xzf{assets\u tar\u path}”
运行“/bin/ln-s{shared_path}/assets{release_path}/public”
运行“/bin/rm{shared_path}/{assets_tar_path}”
结束
如果使用,请将其添加到最后一个块:
run "cd #{release_path}; #{rake} assets:clean_expired 2> /dev/null"
运行“cd#{release_path};#{rake}资产:clean_expired 2>/dev/null”
这听起来是一个合理的方法:)+1内森,这的确是一件了不起的工作。我一定会把这个添加到我的项目中,让你知道。然后,可以考虑转换接受的答案:“弥敦,这对我不起作用。我一直在获取“nil:NilClass的未定义方法`摘要'”,您希望我提供任何细节以便我们能够解决这个问题吗?我也会在github上提交一个问题,hi@thanikkal,谢谢你的反馈!请将gem更新到最新版本,然后再试一次,我认为它应该被修复。谢谢Nathan!太快了!真快!!!我能够在没有错误的情况下预编译资产。将在下次部署期间验证。如果您仍然在这里只是想确认(可能是一个愚蠢的问题),这将照顾到引擎内的资产以及.erb资产模板,对吗?@nathan.f77您的gem太棒了。此外,您为Capistrano部署资产的方式所做的更改也值得称赞。