在Capistrano中有条件地禁用资产预编译

Bes*_*sey 10 capistrano ruby-on-rails

我已经看到了在Rails中执行延迟资产预编译的各种复杂且通常无效的解决方案.作为一个后端开发人员,我并不特别想重新编译我从未在每次程序部署时触及的资产,但由于资产是Capfile通过加载load 'deploy/assets'而不是通过定义任务deploy.rb,我想不出有条件地禁用它的方法.

我所追求的行为是cap deploy用于常规的预编译部署,并cap deploy:no_assets用于跳过资产部署.

lul*_*ala 15

turbo-sporocket-rails和自动跳过脚本都有一些陷阱(我稍后会提到).所以我使用下面的hack,所以我可以传递一个参数来跳过我想要的资产预编译:

callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" }
callbacks[:after].delete(callback)
after 'deploy:update_code', 'deploy:assets:precompile' unless fetch(:skip_assets, false)
Run Code Online (Sandbox Code Playgroud)

此脚本将更改内置资产预编译挂钩,因此将根据skip_assets参数挂钩.我可以调用cap deploy -S skip_assets=true跳过资产预编译作为一个整体.


对我来说,当没有任何改变时,turbo-sporocket-rails仍需要几分钟才能完成检查.当我需要尽快将修复程序推送到服务器时,这可能是至关重要的.因此我需要我的力量跳跃方法.


pla*_*rms 7

rails4通过预编译已更改的资产来解决此问题的新版sprockets.同时,对于您的rails3应用程序,我推荐使用turbo-sprockets-rails3 gem.

这种宝石开始了作为一个补丁集用于sprockets-rails由Nathan布罗德,这些都没有并入master因为这个问题是在rails4已经解决.来自README:

  • 加速你的Rails 3 rake资产:只根据源文件的哈希值重新编译已更改的资产进行预编译

  • 仅编译一次以生成指纹和非指纹资产

和:

turbo-sprockets-rails3应该可以与最新版本的Capistrano一起开箱即用.

我可以确认它适用于使用Capistrano部署的rails-3.2.x应用程序.

作为GitHubbers的旁注,原始的pull请求是如何将代码提交给开源项目的一个很好的例子,即使它没有被合并.

  • 我确实有Rails 4.0,我不会更改任何资产,但它只是从头开始重新编译.任何的想法? (2认同)