我已经看到了在 Rails 中执行惰性资产预编译的各种复杂且通常无效的解决方案。作为后端开发人员,我并不特别希望每次部署程序时都重新编译我从未接触过的资产,但由于资产是Capfile
通过加载的load 'deploy/assets'
,而不是通过在 中定义任务deploy.rb
,我想不出有条件地禁用它的方法.
我所追求的行为是cap deploy
用于常规预编译部署,并用于cap deploy:no_assets
跳过资产部署。
我已经看到了在 Rails 中执行惰性资产预编译的各种复杂且通常无效的解决方案。作为后端开发人员,我并不特别希望每次部署程序时都重新编译我从未接触过的资产,但由于资产是Capfile
通过加载的load 'deploy/assets'
,而不是通过在 中定义任务deploy.rb
,我想不出有条件地禁用它的方法.
我所追求的行为是cap deploy
用于常规预编译部署,并用于cap deploy:no_assets
跳过资产部署。
turbo-sporocket-rails 和 that auto-skip 脚本都有一些陷阱(我稍后会提到)。所以我使用了下面的技巧,所以我可以传递一个参数来随意跳过资产预编译:
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 在没有任何变化的情况下仍然需要几分钟来进行检查。当我需要尽快将修复推送到服务器时,这可能至关重要。因此我需要我的强制跳过方法。
rails4使用新版本的 sprockets 解决了这个问题,只预编译已更改的资产。同时,对于您的rails3应用程序,我推荐turbo-sprockets-rails3 gem。
这个 gem 最初是由Nathan Broadbent 提供的一组补丁,由于问题已经在 rails4 中得到解决sprockets-rails
,因此没有合并到这些补丁中。master
从自述文件:
加速 Rails 3 rake 资产:仅根据源文件的哈希重新编译更改的资产进行预编译
仅编译一次即可生成指纹和非指纹资产
和:
turbo-sprockets-rails3 应该可以与最新版本的 Capistrano 一起使用。
我可以确认它适用于使用 Capistrano 部署的 rails-3.2.x 应用程序。
作为 GitHubbers 的旁注,原始拉取请求是一个很好的示例,说明如何将代码提交到开源项目,即使它没有被合并。
这个要点看起来很有前途https://gist.github.com/3072362
它会检查您从上次部署到现在的 git 日志,以查看是否有任何更改,%w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb)
如果有,则仅进行预编译。