Ruby on rails 3.1 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微实例上的预编译时间太长(有时只是挂起), 如果在部署开始之前就可以完成资产编译,这样我就可以将服务器从繁重的工作负载中解救出来,直到至少我有更好的服务器可用。目

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

当我尝试内置的capistrano配方时
加载“部署/资产”
它运行
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部署资产的方式所做的更改也值得称赞。