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

时间:2012-07-15 14:15:52

标签: ruby-on-rails capistrano

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

我所遵循的行为是使用deploy.rb进行常规的预编译部署,并使用cap deploy来跳过资产部署。

3 个答案:

答案 0 :(得分:14)

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)

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


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

答案 1 :(得分:7)

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

这个gem由Nathan Broadbent以sprockets-rails set of patches开头,但未合并到master,因为问题已在rails4中解决。来自自述文件:

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

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

  •   

  

turbo-sprockets-rails3应该可以使用最新版本的Capistrano开箱即用。

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

作为GitHubbers的旁注,最初的pull request是如何向开源项目提交代码的一个很好的例子,即使它没有合并。

答案 2 :(得分:1)

这个要点看起来很有希望https://gist.github.com/3072362

它检查从上次部署到现在的git日志,看看%w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb)中是否有任何更改,如果是,则只预编译。