В файле Rails Sprockets для дайджестов используется локальный манифест, а не версия хоста ресурса. - PullRequest
0 голосов
/ 29 мая 2018

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

Для достижения этой цели мы меняем используемую папку.в CDN, например, так:

config.action_controller.asset_host = Proc.new { |source, request|
  if request.subdomain.present?
    "http#{request.ssl? ? 's' : ''}://cdn.domain.com/#{request.subdomain}/"
  else
    "http#{request.ssl? ? 's' : ''}://#{request.host_with_port}/"
  end
}

Каждый раз, когда мы создаем нового клиента, мы компилируем ресурсы вручную, используя специальный инструмент сборки, который использует Sprockets для создания ресурсов так же, как это делает Rails, и затем загружает их в нашCDN в папке, соответствующей поддомену.Это тогда позволяет нам иметь различные наборы ресурсов, основанные исключительно на поддомене.

Теперь это работает нормально, за исключением того, что при обновлении ресурса дайджест изменится для этого файла, но Rails все равно попытается загрузить старый активдайджесты, потому что файл sprockets-manifest (который находится в / public / assets), например, .sprockets-manifest-12345.json загружается вместо того, который находится в CDN.Несмотря на то, что хост ресурса отличается, он по-прежнему загружает локальный.

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

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

После прочтения документации кажется, что вы можете изменить местоположение манифеста.Мы попытались сделать это, используя ту же логику, что и выше, для манифеста следующим образом:

  config.assets.manifest = Proc.new { |source, request|
    if request.subdomain.present?
      "http#{request.ssl? ? 's' : ''}://cdn.domain.com/#{request.subdomain}/"
    else
      "http#{request.ssl? ? 's' : ''}://#{request.host_with_port}/"
    end
  }

Но Rails / Sprockets все еще использует локальный файл sprockets ... Есть идеи, почему?

...