Условно отключить активацию прекомпиляции в Капистрано

Я видел различные запутанные и вообще неэффективные решения для выполнения ленивых активов, предварительно скомбинированных в Rails. В качестве стороннего разработчика я не особо хочу перекомпилировать активы, которые я никогда не трогаю каждый раз, когда программа развертывается, а потому, что ресурсы загружаются в Capfile через load 'deploy/assets', а не путем определения задачи в deploy.rb, я могу " t думать о способе условно отключить его.

Поведение, которое мне нужно, - использовать cap deploy для обычного развертывания с предварительным распадом и использовать cap deploy:no_assets для пропуска развертывания активов.

Ответ 1

rails4 решает эту проблему с помощью новой версии звездочек, только предварительно скомпилировав измененные активы. В то же время для ваших приложений rails3 я рекомендую turbo-sprockets-rails3 gem.

Этот драгоценный камень начинался как набор исправлений для sprockets-rails от Nathan Broadbent, которые не были объединены в master, потому что проблема был уже рассмотрен в rails4. Из README:

  • Ускоряет ваши рейк-активы Rails 3: прекомпилирует только перекомпиляцию измененных активов на основе хеша исходных файлов

  • Только один раз компилируется для создания как отпечатков пальцев, так и без отпечатков пальцев.

и

turbo-sprockets-rails3 должен работать из коробки с последней версией Capistrano.

Я могу подтвердить, что он работает хорошо для меня в rails-3.2.x приложениях, развертывающих с Capistrano.

В качестве дополнительной заметки для GitHubbers исходный запрос на перенос - отличный пример того, как отправить код в проект с открытым исходным кодом, даже если он не был объединен.

Ответ 2

Оба турбо-sporocket-rails и сценарии автопропуска имеют некоторые подводные камни (я расскажу позже). Поэтому я использую следующий хак, поэтому могу передать параметр, чтобы пропустить предварительную компиляцию активов по моей воле:

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)

Этот script изменит встроенный крюк с активацией precompile, поэтому он будет подключен на основе параметра skip_assets. Я могу вызвать cap deploy -S skip_assets=true, чтобы пропустить прекомпиляцию активов в целом.


Для меня турбо-sporocket-rails все еще занимает несколько минут, чтобы проверить, когда ничего не изменилось. Это может иметь решающее значение, когда мне нужно нажать исправление на сервер как можно скорее. Поэтому мне нужен мой метод проскока.

Ответ 3

Этот эффект выглядит очень перспективным https://gist.github.com/3072362

Он проверяет ваш журнал git от последнего развертывания до теперь, чтобы увидеть, есть ли какие-либо изменения в %w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb), и если это так, тогда только прекомпилирует.