17

我正在使用 Rails 3.2.13 和 Rails 资产管道。我想使用 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 按需编译资产但不缓存结果?

4

3 回答 3

30

这是魔法咒语:

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 编译器也有它自己的缓存,如果你需要禁用它,你必须单独禁用它。

于 2013-06-20T03:00:30.610 回答
1

我创建了以下要点(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
于 2014-02-16T02:26:32.240 回答
0

公认的答案没有正确执行,并且通过完全禁用缓存来降低开发性能。回答您的原始问题,您希望更改引用文件以使资产缓存无效,即使没有直接包含。

解决方案是简单地声明这种依赖关系,以便 sprockets 知道缓存应该无效:

# 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
于 2017-07-16T11:33:42.473 回答