У меня есть приложение Rails 4, которое было недавно сильно обновлено (с точки зрения версий гемов и некоторых других вещей). Развертывания работали нормально, но как только мы очистили наши каталоги tmp, мы заметили, что активы перестали работать в производстве. По какой-то причине в производственном режиме происходит то, что помощники не используют дайджесты ни в одном из имен файлов ресурсов (например, /javascripts/application.js
вместо /javascripts/application-some-digest.js
). Это приводит к тому, что эти ресурсы равны 404, поскольку они существуют с собственными именами дайджестов в каталоге public
, а Google App Engine настроен на независимое обслуживание файлов stati c для каталога publi c (который всегда работал нормально ). Что действительно странно, так это то, что в промежуточном режиме приложение все делает правильно, поэтому в нашей производственной среде есть нечто, заставляющее помощников не использовать дайджесты.
Даже страннее, если Я go RAILS_ENV=production rails console
и делаю helper.asset_path 'application.js'
Я получаю правильное имя файла с дайджестом. Что может происходить на земле?
И да, мы делаем RAILS_ENV=production rake:assets:precompile
перед развертыванием.
Вот соответствующие части из config/environments/production.rb
:
config.eager_load = true
config.assets.cache_store = :dalli_store
# Don't force SSL because we need non-ssl cookies.
config.force_ssl = false
config.stripe_livemode = true
config.assets.digest = true
config.assets.compile = false
Вот соответствующие части от config/environments/shared.rb
:
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_files = false
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Precompile additional assets (application.js, application.css, and all
# non-JS/CSS are already added)
config.assets.precompile += ['zxcvbn.js', 'hammer.min.js', 'jquery.ba-throttle-debounce.min.js', 'mediaCheck.js', 'application-no-mq.css', 'lte-ie7.js', 'mailcheck.js', 'browserconfig.xml', 'main.css', 'oamm.js', 'oamm.min.js']
Вот соответствующие части от config/application.rb
:
config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )
# Enable the asset pipeline
config.assets.enabled = true
config.log_level = :info
config.assets.precompile += ['rails_admin/rails_admin.css', 'rails_admin/rails_admin.js']
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
И, наконец, вот соответствующие части от config/environments/staging.rb
который как-то работает нормально:
# Speed up asset compilation on Heroku.
config.assets.cache_store = :dalli_store
config.eager_load = true
config.stripe_livemode = false