Отключить кэширование активов Sprockets в разработке
Я использую Rails 3.2.13 и Rails Asset Pipeline. Я хочу использовать Asset Pipeline, чтобы я мог использовать SASS, CoffeeScript и ERB для своих активов, и Pipeline автоматически их компилирует, поэтому я не могу отключить конвейер в разработке. Я не прекомпиляции активов в разработке никогда и нет даже каталога public/assets/
.
Однако, когда я вношу изменения во включенный файл, например, в файл _partial.html.erb
, который включен (отображается) в файле layout.html.erb
, без изменения файла, делающего сам включение (в этом примере layout.html.erb
), Sprockets не обнаруживает изменения и делает недействительными кеш, поэтому я продолжаю получать один и тот же устаревший файл. Когда я делаю это в активной разработке, я хочу отключить любое кэширование активов, чтобы я мог получать изменения по каждому запросу, но я не могу понять, как это сделать. Я установил все следующие в моем development.rb
:
config.action_controller.perform_caching = false
config.action_dispatch.rack_cache = nil
config.middleware.delete Rack::Cache
config.assets.debug = true
config.assets.compress = false
config.cache_classes = false
Тем не менее, даже при этом файлы отображаются под tmp/cache/assets/
и tmp/cache/sass/
, и изменения в будущих запросах недоступны. Прямо сейчас мне приходится вручную удалять эти каталоги каждый раз, когда я хочу увидеть изменения.
К сожалению, все содержимое раздела Как работает кеширование в руководстве RoR для конвейера активов:
Sprockets использует хранилище кешей Rails по умолчанию для кэширования активов в развития и производства.
TODO: добавьте больше об изменении хранилища по умолчанию.
Итак, как я могу получить Sprockets для компиляции активов по требованию, но не кэшировать результаты?
Ответы
Ответ 1
Здесь магическое заклинание:
config.assets.cache_store = :null_store # Disables the Asset cache
config.sass.cache = false # Disable the SASS compiler cache
Консоль ресурса имеет собственный экземпляр кэша, а параметр config.assets.cache = false
ничего не делает, поэтому вы должны установить его кеш <<22 > , чтобы отключить его.
Даже тогда компилятор SASS имеет собственный кеш, и если вам нужно его отключить, вы должны отключить его отдельно.
Ответ 2
Я создал следующий gist (https://gist.github.com/metaskills/9028312), который делает именно это, и нашел, что это единственный способ, который работает для меня.
# In config/initializers/sprockets.rb
require 'sprockets'
require 'sprockets/server'
Sprockets::Server.class_eval do
private
def headers_with_rails_env_check(*args)
headers_without_rails_env_check(*args).tap do |headers|
if Rails.env.development?
headers["Cache-Control"] = "no-cache"
headers.delete "Last-Modified"
headers.delete "ETag"
end
end
end
alias_method_chain :headers, :rails_env_check
end
Ответ 3
Принятый ответ не делает это правильно и ухудшает производительность в разработке, полностью отключив кеш.
Отвечая на ваш первоначальный вопрос, вы хотите, чтобы изменения в файлах, на которые ссылались, приводили к недействительности кэша ресурсов, даже если они не были включены напрямую.
Решение состоит в простом объявлении такой зависимости, что звездочки знают, что кеш должен быть недействительным:
# layout.html.erb
<% depend_on Rails.root.join('app').join('views').join('_partial.html.erb') %>
# replace the above with the correct path, could also be relative but didn't try