У меня только что была эта проблема, но я хотел придерживаться развертывания git без дополнительного скрипта в качестве оболочки.
Поэтому мой подход - написать файл во время генерации слагов с помощью uuid, который отмечает текущийпрекомпиляция.Это делается как ловушка в assets:precompile
.
# /lib/tasks/store_asset_cacheversion.rake
# add uuidtools to Gemfile
require "uuidtools"
def storeCacheVersion
cacheversion = UUIDTools::UUID.random_create
File.open(".cacheversion", "w") { |file| file.write(cacheversion) }
end
Rake::Task["assets:precompile"].enhance do
puts "Storing git hash in file for cache invalidation (assets:precompile)\n"
storeCacheVersion
end
Rake::Task["assets:precompile:nondigest"].enhance do
puts "Storing git hash in file for cache invalidation (assets:precompile:nondigest)\n"
storeCacheVersion
end
Другой инициализатор, который проверяет этот идентификатор в кэшированной версии.Если они различаются, произошла другая прекомпиляция, и кеш будет признан недействительным.
Таким образом, не имеет значения, как часто приложение вращается вверх или вниз или на сколько узлов будет распределяться рабочий, потому что генерация слагов происходит только один раз.
# /config/initializers/00_asset_cache_check.rb
currenthash = File.read ".cacheversion"
cachehash = Rails.cache.read "cacheversion"
puts "Checking cache version: #{cachehash} against slug version: #{currenthash}\n"
if currenthash != cachehash
puts "flushing cache\n"
Rails.cache.clear
Rails.cache.write "cacheversion", currenthash
else
puts "cache ok\n"
end
Мне нужноиспользовать случайный идентификатор, потому что, насколько я знаю, нет способа получить хэш git или любой другой полезный идентификатор.Возможно ENV[REQUEST_ID]
, но это тоже случайный идентификатор.
Хорошая особенность uuid в том, что он теперь также не зависит от heroku.