Heroku конфликт между сжатыми активами и прекомпиляцией активов - PullRequest
7 голосов
/ 19 октября 2011

Пару месяцев назад я запускаю приложение Rails 3.1 в Heroku Cedar Stack. Я использую промежуточное ПО Rack :: Deflater, чтобы сжать мой контент и добиться этого с помощью

config.middleware.insert_before ActionDispatch::Static, Rack::Deflater

в моем файле staging.rb.

Однако, начиная с прошлой недели, я получаю следующую ошибку при развертывании в Heroku

Running: rake assets:precompile
   rake aborted!
   No such middleware to insert before: ActionDispatch::Static

Тем не менее, запуск промежуточного программного обеспечения rake по-прежнему возвращает

use Rack::Cache
use Rack::Deflater
use ActionDispatch::Static
use Rack::Lock

И контент был по-прежнему разархивирован. Однако активы не были скомпилированы (минимизированы), так как предварительная компиляция не удалась. Ручная прекомпиляция рейка :: asets также не помогает.

Итак, я предполагаю, что ActionDispatch :: Static недоступен во время предварительной компиляции ресурсов. Поэтому я попытался вставить Rack :: Deflater перед Rack :: Lock, и теперь мои ресурсы компилируются без каких-либо сообщений об ошибках, но обслуживаемый контент не распаковывается.

Итак, что мне нужно сделать, чтобы gzip и скомпилировали мои ресурсы? Что мне не хватает? Спасибо.

Ответы [ 2 ]

5 голосов
/ 09 января 2012

Просто один на один Rack::Deflater уже используется Rails 3.1 , поэтому вам не нужно делать это вручную.

НО, чтобы ответить на вашу проблему здесь, я бы предположилчто на вашем production.rb установлено config.serve_static_assets = false.

промежуточное ПО ActionDispatch::Static используется только в том случае, если для serve_static_assets установлено значение true.Heroku фактически внедряет этот конфиг, чтобы переопределить все, что вы в любом случае установили (см. Сообщение журнала Injecting rails3_serve_static_assets при развертывании), но я не уверен, на каком этапе развертывания это происходит.

Так что, вероятно, выпри запуске assets:precompile не включается статическое обслуживание ресурсов (обратите внимание, это всего лишь предположение, я еще не на Rails 3.1, поэтому могу ошибаться)

Я бы рекомендовал против предложения membLoper о добавленииэто вручную в вашем файле стойки:

  1. это не нужно, как объяснено выше
  2. ваше промежуточное ПО, которое имеет отношение к вашему приложению, должно быть действительно внедрено, как вы изначально пытались в вашем application.rb
3 голосов
/ 20 октября 2011

Я до сих пор не понимаю, почему Heroku не распознает ActionDispatch :: Static во время предварительной компиляции активов. Тем не менее, ребята из Heroku предложили обойти эту проблему.

Промежуточное программное обеспечение Rack :: Deflater должно быть вставлено в файл config.ru, а не в файлы среды. Что-то вроде

require ::File.expand_path('../config/environment',  __FILE__)
# Middleware to gzip content
use Rack::Deflater
run MyApplication

Таким образом, он не мешает предварительной компиляции ресурсов и все еще сохраняет сжатый контент.

Любой ресурс о том, как работает config.ru и где сейчас находится Rack :: Deflater, очень приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...