Ruby on Rails: геройки запускают рейк-активы: прекомпилировать
Пожалуйста, помогите мне понять, что именно делает heroku run rake assets:precompile
. С тех пор, как я начал работать над рубинами на рельсах, я всегда буду запускать эти три команды, прежде чем я надаю на github и heroku:
bundle exec rake assets:precompile
RAILS_ENV=production bundle exec rake assets:precompile
После того, как я нажимаю на герою, я буду запускать:
heroku run rake assets:precompile
Однако, когда я попытался запустить его после моего последнего нажатия на герою, я получил кучу одинаковых ошибок в разных файлах. Например:
Warning. Error encountered while saving cache ... can't dump anonymous class ...
Чтобы узнать, могу ли я исправить это, я запустил
heroku run rake assets:clean
, а затем heroku run rake assets:precompile
снова. Дело в том, что все работает нормально, но я просто чувствую, что имею все эти предупреждения/ошибки. Пожалуйста, помогите мне понять. Спасибо!
Ответы
Ответ 1
Прекомпиляция
Чтобы дать вам более четкие определения - Heroku
- не единственная система, которая требует от вас "предварительной компиляции" ваших активов. Предварительная компиляция активов является предпосылкой большинства производственных процессов Rails, поскольку она позволяет обслуживать статические активы (файлы) - идеально подходит для скорости и эффективности
Здесь описывается документация Rails:
В производственной среде Sprockets использует схему отпечатков пальцев изложенных выше. По умолчанию Rails предполагает, что активы были предварительно скомпилированы и будет служить в качестве статических активов вашим веб-сервером.
На этапе предварительной компиляции MD5 генерируется из содержимого скомпилированных файлов и вставлены в имена файлов, поскольку они записанный на диск. Эти имена отпечатков пальцев используются Rails помощников вместо имени манифеста.
Причина, по которой Heroku хочет, чтобы вы прекомпилировали свои активы, состоит в том, что среда Heroku предназначена для скорости и эффективности; и, следовательно, не хочет расходовать процессорную мощность на компиляцию аттестатов для каждого запроса /instanace вашего приложения.
Это означает, что вам нужно либо предварительно скомпоновать активы самостоятельно, либо позволить Heroku buildpacks сортировать это для вас
Heroku
Как уже упоминалось в CWitty
, вы должны убедиться, что вы компилируете свои ресурсы локально. И хотя я не уверен в полученных вами ошибках, я знаю одно: прекомпиляция заполняет папку public/assets
Это означает, что если вы предварительно скопируете локально перед отправкой в Heroku, у вас будут все ваши последние активы, присутствующие в вашем каталоге public/assets
, прежде чем пытаться запустить приложение на Heroku
Хотя Heroku выполняет предварительную компиляцию как часть процесса сборки, вы будете намного безопаснее (с точки зрения исключения) путем предварительной компиляции локально:
$ rake assets:precompile RAILS_ENV=production
Это даст вам возможность заполнить папку public/assets
, позволяющую затем нажать на Heroku без каких-либо проблем.
Ответ 2
Вы должны запустить эту команду, прежде чем нажимать на Heroku, поскольку она ** pre ** компилирует ваши активы. Heroku автоматически выполнит эту команду, если вам не хватает файла manifestast.yml. После запуска rake assets:precompile
локально вы можете выполнить все изменения, а затем нажать на Heroku.
Ответ 3
Для тех, у кого возникли проблемы с выяснением причин, почему Heroku не будет автоматически компилировать ваши активы:
Если в вашем приложении обнаружен public/assets/manifest.yml, Heroku предположит, что вы сами обрабатываете компиляцию активов и не будете пытаться скомпилировать свои активы. В Rails 4 вместо этого используется файл public/assets/manifest-.json. В обеих версиях вы можете сгенерировать этот файл, запустив $rake assets: предварительно скомпилируйте локально и проверив результирующие файлы на Git.
Я нашел sprockets-manifest-*.json
, и Heroku начал компилировать мои активы автоматически после того, как я удалил этот файл.
В моем случае этот файл был создан script rails_composer
.
Ответ 4
Если у вас есть .jpeg, обязательно замените их на .jpg перед компиляцией. Шаг компиляции сделает это за вас, но ваши изображения будут отключены, если вы укажете свои файлы с расширениями.