Отключить кэширование ресурсов Sprockets в разработке
Я использую Rails 3.2.13 и Rails Asset Pipeline. Я хочу использовать конвейер активов, чтобы я мог использовать SASS, CoffeeScript и ERB для своих активов, и чтобы конвейер автоматически их компилировал, поэтому я не могу отключить конвейер в процессе разработки. Я не прекомпилирую ресурсы в разработке, и нет даже 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 компилировать ресурсы по требованию, но не кэшировать результаты?
3 ответа
Вот волшебное заклинание:
config.assets.cache_store = :null_store # Disables the Asset cache
config.sass.cache = false # Disable the SASS compiler cache
Конвейер активов имеет свой собственный экземпляр кеша и настройки config.assets.cache = false
ничего не делает, поэтому вы должны установить его кеш null_store
отключить это.
Даже в этом случае компилятор SASS имеет свой собственный кеш, и если вам нужно его отключить, вы должны отключить его отдельно.
Я создал следующую суть ( 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
Принятый ответ не делает это правильно, и он снижает производительность в разработке, полностью отключая кеш. Отвечая на ваш первоначальный вопрос, вы хотите, чтобы изменения в ссылочных файлах сделали недействительным кеш ресурса, даже если он не включен напрямую.
Решение состоит в том, чтобы просто объявить такую зависимость, чтобы звездочки знали, что кеш должен быть признан недействительным:
# 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