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 перед компиляцией. Шаг компиляции сделает это за вас, но ваши изображения будут отключены, если вы укажете свои файлы с расширениями.