#ruby-on-rails #asset-pipeline #cdn
Вопрос:
Я использую хост активов (AWS Cloudfront) для своего приложения Rails:
# config/environments/production.rb
config.asset_host = "xxxxxxxxxxx.cloudfront.net"
Во время развертывания в моей службе CI я предварительно компилирую ресурсы:
bundle exec rake assets:precompile
А затем переместите эти сгенерированные активы в корзину S3, которая служит источником распространения Cloudfront.
Примечание: Я не включаю предварительно скомпилированные ресурсы в свой окончательный образ docker, который в конечном итоге будет развернут.
Теперь, когда я запускаю сервер и пытаюсь получить к нему доступ, я получаю сообщение об ошибке:
application.css отсутствует в конвейере ресурсов
Я знаю, что в Stackoverflow есть несколько вопросов с этим конкретным сообщением об ошибке. Но я перепробовал все, например, настройку config.assets.compile = true/false
, но единственное, что заставило ее работать, — это включение предварительно скомпилированных ресурсов в сборку (окончательный образ докера).
Итак, теперь я спрашиваю себя: должен ли я всегда включать активы локально, хотя я использую хост активов?!
Ответ №1:
способ asset pipeline
разрешения пути к активу, по которому он сначала будет искать fingerprinting
файл актива (который будет сгенерирован задачей rake precompile
), а затем сопоставляться asset_host
(если таковые имеются), если fingerprinting
для актива нет карты, то он выдаст исключение, оно не проверяет ваш asset_host
.
если вы не включите предварительно скомпилированные ресурсы в образ docker, ваше приложение rails в контейнере docker не сможет найти файлы ресурсов, так fingerprinting
как в этом контейнере нет сгенерированных ресурсов.
так что да, ты должен это сделать.
однако, можно обойти asset pipeline
путем добавления косой черты перед активов путь или добавить skip_pipeline: true
, в вашем случае, вы уже производят снятие отпечатков пальцев и перенести эти файлы в свой актив хозяин так можно обойти ,например application.css
, как этот stylesheet_link_tag '/application-{fingerprinting}.css'
, но, очевидно, это не самый хороший выбор, так как вы должны сделать это для всех файлов.
Комментарии:
1. Большое вам спасибо за ваш вклад. Вы не знаете, есть ли какая-либо официальная документация по этому поводу?
2. @заратустра прочитал код, код говорит все, вот: github.com/rails/rails/blob/main/actionview/lib/action_view/… , и здесь: github.com/rails/sprockets-rails/blob/master/lib/sprockets/…