Отключить кэширование ресурсов 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
Другие вопросы по тегам