我已经看到在Rails中执行延迟资产预编译的各种复杂且通常无效的解决方案。作为后端开发人员,我并不特别想重新编译每次程序部署时都不会触及的资产,而是因为资产是Capfile
通过load 'deploy/assets'
加载的,而不是通过{{1}中定义任务我想不出有条件地禁用它的方法。
我所遵循的行为是使用deploy.rb
进行常规的预编译部署,并使用cap deploy
来跳过资产部署。
答案 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)
中是否有任何更改,如果是,则只预编译。