Предварительная компиляция активов на компьютере разработчика перед развертыванием Capistrano - PullRequest
4 голосов
/ 24 ноября 2011

Я хочу, чтобы прекомпиляция актива происходила на моей машине разработчика до того, как код будет упакован (tar ball'ed) capistrano, и предварительно скомпилированные ресурсы уже будут включены в окончательный пакет развертывания.

Когда я пытаюсьвстроенный рецепт capistrano, который в load 'deploy/assets' запускается rake RAILS_GROUPS=assets assets:precompile на сервере.

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

Ответы [ 3 ]

3 голосов
/ 03 октября 2012

Я только что написал гем для решения этой проблемы в Rails, он называется turbo-sprockets-rails3 .Он ускоряет вашу assets:precompile, перекомпилируя только измененные файлы и компилируя только один раз, чтобы сгенерировать все ресурсы.Он работает "из коробки" для Capistrano, так как ваш каталог ресурсов распределяется между выпусками.

Было бы действительно здорово, если бы вы могли помочь мне протестировать гем turbo-sprockets-rails3 ,и дайте мне знать, если у вас возникнут проблемы.

3 голосов
/ 25 ноября 2011

В настоящий момент рабочий процесс все еще немного затруднен, но вы можете добиться некоторого успеха, используя Guard-Rails-Assets . Это немного медленно, особенно если вы делаете много изменений активов, но оно будет компилировать активы, когда они будут изменены, и вы можете просто зарегистрировать их в своем репо для последующего развертывания.

1 голос
/ 02 декабря 2012

Удалите load 'deploy/assets' из Capfile или config/deploy.rb и добавьте следующие строки в config/deploy.rb:

set :assets_role, [ :web, :app ]
set :normalize_asset_timestamps, false
set :assets_tar_path, "#{release_name}-assets.tar.gz"

before "deploy:update" do
  run_locally "rake assets:precompile"
  run_locally "cd public; tar czf #{Dir.tmpdir}/#{assets_tar_path} assets"
end

before "deploy:finalize_update", :roles => assets_role, :except => { :no_release => true } do
  upload "#{Dir.tmpdir}/#{assets_tar_path}", "#{shared_path}/#{assets_tar_path}"
  run "cd #{shared_path}; /bin/tar xzf #{assets_tar_path}"
  run "/bin/ln -s #{shared_path}/assets #{release_path}/public"
  run "/bin/rm #{shared_path}/#{assets_tar_path}"
end

Если вы используете turbo-sprockets-rails3 , добавьте это к последнему блоку:

  run "cd #{release_path}; #{rake} assets:clean_expired 2> /dev/null"
...