Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditionally disable asset precompile in Capistrano

I've seen various convoluted and generally ineffective solutions to performing lazy asset precompile in Rails. As a backend developer I don't particularly want to recompile assets I never touch every time the program deploys, but because assets are loaded in Capfile via load 'deploy/assets', and not by defining a task in deploy.rb, I can't think of a way to conditionally disable it.

The behaviour I'm after is to use cap deploy for regular with-precompile deployment, and to use cap deploy:no_assets to skip asset deployment.

like image 956
Bessey Avatar asked Jul 15 '12 14:07

Bessey


2 Answers

Both turbo-sporocket-rails and the that auto-skip scripts have some pitfalls (I will mention later). So I use the following hack, so I can pass a parameter to skip asset pre-compile at my will:

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)

This script will change the built-in asset-precompile hook, so it will be hooked based on the skip_assets parameter. I can call cap deploy -S skip_assets=true to skip asset precompile as a whole.


For me, turbo-sporocket-rails still takes minutes to do the checking when nothing has changed. This can be crucial when I need to push a fix to the server asap. Therefore I need my force-skipping method.

like image 160
lulalala Avatar answered Nov 09 '22 04:11

lulalala


rails4 addresses this issue with it's new version of sprockets, by only precompiling assets that have changed. In the mean time, for your rails3 apps I recommend the turbo-sprockets-rails3 gem.

This gem started out as a set of patches for sprockets-rails by Nathan Broadbent, which were not merged into master because the problem was already addressed in rails4. From the README:

  • Speeds up your Rails 3 rake assets:precompile by only recompiling changed assets, based on a hash of their source files

  • Only compiles once to generate both fingerprinted and non-fingerprinted assets

And:

turbo-sprockets-rails3 should work out of the box with the latest version of Capistrano.

I can confirm that it works well for me on rails-3.2.x apps deploying with Capistrano.

As a side note for GitHubbers, the original pull request is an excellent example of how to submit code to an open source project, even if it wasn't merged.

like image 7
platforms Avatar answered Nov 09 '22 04:11

platforms