10

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

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

4

3 回答 3

15

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 在没有任何变化的情况下仍然需要几分钟来进行检查。当我需要尽快将修复推送到服务器时,这可能至关重要。因此我需要我的强制跳过方法。

于 2013-05-15T03:45:47.917 回答
7

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 的旁注,原始拉取请求是一个很好的示例,说明如何将代码提交到开源项目,即使它没有被合并。

于 2013-02-13T19:26:29.287 回答
1

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

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

于 2012-07-15T14:41:10.210 回答