Rails не использует новый файл manifest-*.json после развертывания

Я развертываю приложение Rails с помощью capistrano, локально компилирую ресурсы и копирую их на сервер с помощью rsync. Вот что происходит в прекомпиляции

desc 'Run the precompile task locally and rsync with shared'
task :precompile, :roles => :web, except: { no_release: true } do
  run "rm -f #{shared_path}/assets/manifest*"
  %x{RAILS_ENV=production bundle exec rake assets:precompile}
  %x{rsync -rave "ssh -i #{ssh_options[:keys][0]}" public/assets #{user}@#{domain}:#{shared_path}}
  %x{RAILS_ENV=production bundle exec rake assets:clean}
  %x{rm -rf public/assets}
end

Активы отображаются на сервере после завершения развертывания, но приложение rails не показывает последние файлы ресурсов. Он показывает файлы из последнего файла манифеста. Я удалил старые файлы манифеста, запустив run «rm -f #{shared_path}/assets/manifest*» в capistrano, но приложение rails не подхватывает новый манифест. Что мне не хватает и как заставить его использовать последний файл манифеста после развертывания.


person Encore PTL    schedule 18.04.2014    source источник
comment
Каждый придумал решение этой проблемы? Я столкнулся с подобным поведением после обновления с Rails 3 -> 4. Решение для взлома состоит в том, чтобы развернуть дважды. Не идеально :-/   -  person Ryan Angilly    schedule 16.09.2014
comment
Также хотелось бы узнать, нашел ли кто-нибудь решение этой проблемы   -  person xdotcommer    schedule 24.09.2014
comment
Та же проблема здесь. Я попытался перейти на последние стабильные звездочки (2.12.3), а затем вместо этого использовать звездочки-рельсы (2.2.2). Также попытался запустить assets:clean на своем сервере в надежде, что там есть какой-то кеш. Не повезло!   -  person steakchaser    schedule 22.01.2015
comment
К сведению: Sprockets выбирает первый найденный файл манифеста. См. строку 50: github.com/sstephenson/sprockets/blob/ мастер/библиотека/звездочки/   -  person steakchaser    schedule 22.01.2015


Ответы (2)


Из того, что я могу сказать:

  1. Capistrano по умолчанию ничего не делает для удаления предыдущих версий файла манифеста.
  2. Звездочки просто выберут первую, если их несколько.
  3. Наличие нескольких файлов манифеста нарушает deploy:assets:update_asset_mtimes задачу Cap 2.

Что вам нужно сделать, это:

  1. Добавьте шаг в поток прекомпиляции, чтобы удалить файл manifest.*json
  2. Сделайте копию манифеста для каждого выпуска, помещенного в корень release_path с именем assets_manifest.json. Cap 2 нужен для :clean_expired и :rollback

Я смог исправить это, удалив файл manifest*.json перед задачей deploy:assets:symlink. На это меня натолкнул гем capistrano-local-precompile. См. :remove_manifest задачу, а также ссылки вопрос №3, так как это не совсем правильно.

person steakchaser    schedule 22.01.2015

FWIW мы решили эту проблему, установив явный манифест в нашем application.rb:

config.assets.manifest = File.join('config', '.sprockets-manifest.json')
person Cameron    schedule 12.07.2016