#ruby-on-rails #heroku #asset-pipeline
#ruby-on-rails #heroku #конвейер активов
Вопрос:
Проблема в двух словах заключается в том, что в режиме разработки мы вносим изменения в файлы CSS или JS, но всегда получаем кэшированные / старые версии этих файлов. Ничто из того, что я делал, не имело никакого эффекта. Я проверял конфигурацию десятки раз и пробовал каждую комбинацию значений конфигурации, но всегда получал одни и те же результаты: устаревшие / кэшированные файлы. Мне пришлось фактически запускать в рабочем режиме и перезапускать сервер после каждого изменения для тестирования.
Я несколько дней рвал на себе волосы из-за этой проблемы, просмотрел десятки вопросов stackoverflow в конвейере активов, но так и не нашел ни одного, который бы решал эту проблему, поэтому я решил опубликовать его здесь для потомков.
Мы используем Heroku и предварительно компилируем наши ресурсы, потому что Heroku не выполняет предварительную компиляцию для нас (мы также используем devise, что, по-видимому, является причиной сбоя предварительной компиляции heroku). Итак, чтобы перенести наши предварительно скомпилированные ресурсы в Heroku, мы должны проверить их в git.
Вот в чем проблема.
При обновлении до Rails 3.1.1 предварительная компиляция ресурсов создавала файлы как с хэшем MD5, так и без него в имени. Я не придал этому большого значения и пошел дальше и проверил все эти файлы, чтобы я мог перейти к heroku. Некоторое время спустя я заметил проблему с кэшированными результатами в режиме разработки. Предварительно скомпилированные и проверенные ресурсы без хэшей MD5 передавались из /public/assets в виде статических файлов, что не позволяло нам видеть какие-либо изменения, которые мы вносили в /app/assets .
Наконец, осознав это, я запустил git rm /public/assets, и все снова заработало. Итак, вывод: будьте осторожны, проверяя активы в git!
Чтобы превратить это в вопрос: как другие это делают? Я упускаю что-то очевидное? Чего бы мне действительно хотелось, так это чтобы Heroku предварительно скомпилировал мои активы для меня, но он терпит неудачу из-за ошибки подключения к БД, которая, как я понимаю, связана с devise. Я надеялся, что Rails 3.1.1 исправил это, но этого не произошло.
Ответ №1:
Вы проверили эту проблему с разработкой на github? В частности, Хосе Валим говорит
В Rails 3.1.1 final есть метод с именем config.assets.initialize_on_precompile. Если вы установите для него значение false, у вас все должно быть хорошо, но это не позволит вам получить доступ к информации о модели ваших активов (чего вам, вероятно, все равно не следует делать).
Возможно, это позволит выполнить предварительную компиляцию на Heroku для вас.
Комментарии:
1. Да, я пробовал эту точную конфигурацию, прежде чем публиковать этот вопрос, но в то время это не сработало для меня. Тем не менее, я только что попробовал это снова, на этот раз с Devise 1.4.9, и вот, это работает! Спасибо за предложение, которое заставило меня попробовать это снова.
2. @JeffCutler-Штамм рад, что это сработало! Я также размещаю приложение rails 3.1.1 на heroku, но еще не добавил devise (но скоро добавлю)
3. Я хотел бы отметить, что вы добавляете это в config/application.rb
4. На самом деле, есть еще один способ заставить предварительную компиляцию работать на Heroku: недавно они добавили флаг, который делает среду (а также БД) доступной во время предварительной компиляции. Просто попросите их включить его. У меня все получилось! Зависимости БД больше не являются проблемой. Не знал об этом новом флаге config.assets.initialize_on_precompile, хотя тоже попробую это сделать.
Ответ №2:
Причина, по которой предварительная компиляция ресурсов не работает, вполне может заключаться в том, что переменные Heroku ENV отсутствуют при компиляции (развертывании) slug, как указано здесь:
http://devcenter.heroku.com/articles/rails31_heroku_cedar
Существует (экспериментальный) способ включить переменные среды во время развертывания именно по этой причине, найдите информацию здесь:
http://devcenter.heroku.com/articles/labs-user-env-compile
Надеюсь, это поможет.
Ответ №3:
Ознакомьтесь с этим руководством от Heroku. В нем описаны 3 способа развертывания приложений Rails 3.1. Два из них не требуют локальной предварительной компиляции.
Комментарии:
1. Спасибо, но у меня ничего из этого не работает. Как я уже упоминал в вопросе, я думаю, это связано с devise. Предварительная компиляция во время компиляции slug всегда завершается ошибкой подключения к базе данных.
2. вы говорите, что компиляция во время выполнения завершается неудачно для вас?
3. да, компиляция во время выполнения завершается с ошибкой, поэтому я застрял с предварительной компиляцией, прежде чем перейти к heroku.