Я пытаюсь использовать Jammit для упаковки CSS и JS для приложения Rails, развернутого на Heroku, которое не работает "из коробки" из-за файловой системы Heroku, доступной только для чтения.Каждый пример, который я видел, как это сделать, рекомендует заранее создавать все упакованные файлы ресурсов.Из-за развертывания Heroku на основе Git это означает, что вам нужно делать отдельную фиксацию в вашем хранилище каждый раз, когда эти файлы изменяются, что для меня неприемлемо.Вместо этого я хочу изменить путь, который Jammit использует для записи кэшированных пакетов, на #{Rails.root}/tmp/assets
(путем изменения ActionController::Base#page_cache_directory
), который доступен для записи в Heroku.
Что я не понимаю, так это как кэшируетсяфайлы будут использоваться без попадания в стек Rails каждый раз, даже используя путь по умолчанию для кэшированных пакетов.Позвольте мне объяснить, что я имею в виду:
Когда вы включаете пакет, используя помощник Jammit, он выглядит примерно так:
<%= include_javascripts :application %>
, который генерирует этот тег сценария:
<script src="/assets/application.js" type="text/javascript"></script>
Когда браузер запрашивает этот URL-адрес, на самом деле происходит маршрутизация на Jammit::Controller#package
, который передает содержимое пакета в браузер и затем записывает кэшированную копию в #{page_cache_directory}/assets/application.js
.Идея состоит в том, что этот кэшированный файл создается по первому запросу, и последующие запросы должны обслуживать кэшированный файл напрямую, не затрагивая стек Rails.Я просмотрел код Jammit и не понимаю, как это должно происходить.Что мешает последующим запросам к /assets/application.js
просто снова направить на Jammit::Controller
и никогда не использовать кэшированный файл?
Я предполагаю, что где-то есть промежуточное программное обеспечение Rack, которое я не вижу, которое обслуживает файл, если он существуети направляет запрос на контроллер, если это не так.Если это так, где этот код?И как это будет работать при изменении ActionController::Base#page_cache_directory
(эффективно, где Jammit записывает кэшированные пакеты)?Поскольку #{Rails.root}/tmp
находится над общедоступным корнем документа, URL-адрес, соответствующий этому пути, отсутствует.