Отключить кэширование активов 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