Webpacker & Rails Asset Pipeline в Docker - View не указывает на обновленный ресурс JS

Я запускаю приложение Rails в контейнере Docker, но у меня проблемы со средой разработки, так как я не могу надежно заставить изменения javascript распространяться на мое приложение, работающее на локальном хосте.

Описание шагов по выявлению проблемы:

  • Если я обновлю представление, я увижу в консоли, которую компилирует webpacker.
  • Он генерирует новый актив с закрытым кешем в public / packs admin-7c69920b702f68258e99.js
  • Файл manifest.json отражает это обновление "admin.js": "/packs/admin-7c69920b702f68258e99.js"
  • Я могу обновлять представление несколько раз, но на вкладке сети видно, что старый актив называется admin-4cf5f7c7d6c5ad665fc6.js.

Я пробовал следующий процесс, но он не запускает обновление ресурсов даже с отключенным кешем.

  • Обновите представление в браузере, чтобы запустить компиляцию веб-пакета.
  • Перезапустите сервер Rails, выйдя из Docker и запустив docker-compose up
  • Обновить вид

Обычно мне приходится останавливать и запускать сервер Rails во второй раз, чтобы запустить обновление ресурсов. Это слишком похоже на вуду для эффективной среды разработки.

Я хотел бы найти способ надежно гарантировать, что последние активы отражаются в моей среде разработки, без необходимости вручную следить за именами файлов ресурсов, чтобы подтвердить, что обновление произошло.

Есть ли уловка для перезагрузки активов, которую я мог бы пропустить?

Я использую ruby: 2.3.7 и Rails 5.2.2.1


person whatapalaver    schedule 23.05.2019    source источник


Ответы (1)


Мне удалось решить проблему, и теперь у меня есть живая перезагрузка моих ресурсов javascript.

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

  • Конфигурационный файл webpacker webpacker.yml имеет ряд значений по умолчанию с параметром cache_manifest, установленным в значение true. Это могло бы объяснить, почему казалось, что браузер придерживается старой инструкции. Решено установкой cache_manifest: false

Это не сразу устранило проблему для приложения, работающего в Docker. По-видимому, вам нужно настроить веб-упаковщик для работы в собственном контейнере. См. Официальные инструкции для веб-упаковщика здесь: https://github.com/rails/webpacker/blob/master/docs/docker.md

Мне показались наиболее полезными следующие инструкции: http://paulsturgess.co.uk/blog/2018/01/09/setup-webpacker-webpack-dev-server-with-docker-compose/

  • Итак, я добавил следующее в свой docker-compose.yml
    version: '3'
    services:
      webpacker:
        build: .
        environment: 
          - WEBPACKER_DEV_SERVER_PUBLIC=localhost:3035
          - WEBPACKER_DEV_SERVER_HOST=localhost
        command: ./bin/webpack-dev-server --inline true
        volumes:
          - .:/myapp
        ports:
          - '3035:3035'
  • Затем запустите docker-compose up --build

Это волшебным образом решает проблему перезарядки.

person whatapalaver    schedule 23.05.2019