Posted over 3 years ago. Visible to the public. Linked content. Deprecated.

Capistrano + Rails: Automatically skipping asset compilation when assets have not changed

Prefer to configure Capistrano so Sprockets can reuse its asset cache:

In medium-sized to large Rails applications, asset compilation can take several minutes. In order to speed up deployment, asset precompilation can be skipped. This card automates the process.

Capistrano 3

namespace :deploy do desc 'Automatically skip asset compile if possible' task :auto_skip_assets do asset_locations = %r(^(Gemfile\.lock|app/assets|lib/assets|vendor/asset)) revisions = [] on roles :app do within current_path do revisions << capture(:cat, 'REVISION').strip end end # Never skip asset compile when servers are running on different code next if revisions.uniq.length > 1 changed_files = `git diff --name-only #{revisions.first}`.split if changed_files.grep(asset_locations).none? puts'** Assets have not changed since last deploy.') invoke 'deploy:skip_assets' end end desc 'Skip asset compile' task :skip_assets do puts Airbrussh::Colors.yellow('** Skipping asset compile.') Rake::Task['deploy:assets:precompile'].clear_actions end end

To use this for all stages, add this line to your Capfile:

before 'deploy:starting', 'deploy:auto_skip_assets'

I have been using this in production successfully. To activate it for staging only, put that line into config/deploy/staging.rb instead.

Note that skip_assets is a separate task, so you'll still be able to skip assets manually.

makandra has been working exclusively with Ruby on Rails since 2007. Our laser focus on a single technology has made us a leader in this space.

Owner of this card:

Dominik Schöler
Last edit:
almost 3 years ago
by Dominik Schöler
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Dominik Schöler to makandra dev
This website uses short-lived cookies to improve usability.
Accept or learn more