Почему я должен предварительно компилировать ресурсы локально при использовании узла ресурсов?

#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/…