Запрет Heroku использовать предварительно скомпилированные ресурсы в режиме разработки
В настоящее время кажется, что Heroku намерен предварительно скомпилировать ресурсы, когда я отправляю свой код до своих экземпляров.
Это отлично подходит для производственных серверов, однако для моего сервера "RAILS_ENV=development" это вызывает проблемы, так как теперь я получаю страницы со всеми файлами JavaScript, обслуживаемыми по отдельности, из моего манифеста активов, а затем еще один файл с тем же кодом, сгруппированный в качестве предварительно скомпилированного актива.
Это приводит к тому, что мои библиотеки jquery datatables ломаются и выдают всплывающие ошибки, которые я не получаю ни в своей локальной среде (разработка или производство), ни в моем производственном экземпляре Heroku.
Есть ли возможность отключить предварительную компиляцию ресурсов в Heroku для экземпляров режима разработки? Или есть причина, по которой они еще не отключены на серверах разработки Heroku?
3 ответа
Если Heroku обнаружит файл public/assets/manifest.yml, они не будут пытаться предварительно скомпилировать ваши ресурсы и предположить, что вы имеете дело с ними самостоятельно. Более подробная информация на http://devcenter.heroku.com/articles/rails31_heroku_cedar
AFAIK, Heroku должен предварительно скомпилировать ресурсы, чтобы обойти их только для чтения FS и тот факт, что конвейер ресурсов Rails хочет записывать файлы в FS. Единственное, что я могу предложить, это выяснить, почему ваши ресурсы ломаются при компиляции.
Я решил эту проблему, добавив в мой Rakefile немного вуду, чтобы отключить задачу rake для прекомпиляции.
сначала я добавляю компонент user-env-compile labs
heroku labs:enable user-env-compile
затем добавьте это в начало моего Rakefile
# found from http://blog.jayfields.com/2008/02/rake-task-overwriting.html
# used by conditional heroku asset compile magick
class Rake::Task
def overwrite(&block)
@actions.clear
enhance(&block)
end
end
Затем я добавляю это грабельное задание в lib/tasks/disable_assets_on_heroku.rake
if ENV['RAILS_ENV'] == 'development'
namespace :assets do
task(:precompile).overwrite do
puts "Asset precompile skipped in #{ENV['RAILS_ENV']}"
end
end
end