6

我已经阅读了很多关于 Rails 资产管道的帖子和文章以及问题和答案,但我仍然没有弄清楚如何完全关闭缓存。

我们正在使用 Rails 3.2.11,在我们的实验室环境(类似于开发)中,我们遇到了问题,因为即使我们没有在资产管道中预编译或指纹资产,它们仍然被缓存在 Rails(机架?) 缓存。这很烦人,因为一些资产是根据其他配置更改的 ERB,因此缓存变得陈旧。为了尝试关闭缓存,我们设置了以下配置:

  config.action_controller.perform_caching = false

  config.assets.compress = false

  config.assets.debug = true

  # just in case
  config.cache_store = :file_store, "file_cache"

然而,资产tmp/cache/assets无论如何都会出现。我至少希望它们出现在 中file_cache,但我真的希望它们根本不会被缓存。

我们如何防止这些资产被缓存?在这种环境中,仅仅删除缓存是不够的。

额外的问题:只要这些文件被缓存,为什么它们在tmp/而不是在file_cache/

4

3 回答 3

8

要关闭资产缓存:

config.assets.cache_store = :null_store

请注意,这是配置。assets .cache_store 不是 Rails config.cache_store。

另请注意,Sass 对编译的样式表有一个单独的缓存,默认情况下在 中tmp/cache/sass,如果你想禁用它,你必须单独执行:

config.sass.cache = false

当Rails指南

Sprockets 将使用默认的 Rails 缓存存储来缓存开发和生产中的资产。

我认为他们的意思是配置的Rails 缓存存储将被使用。我错了,除非您明确更改资产缓存,否则它使用默认缓存。

于 2013-03-13T18:53:20.887 回答
-1

要完全禁用资产管道,您可以在环境文件中添加此指令:

config.assets.enabled = false

但是,如果您仍然想享受静态 JS 和 CSS 的资产管道编译和缓存,同时将 ERB 文件用于动态资产,您可以my_assets_controller为该控制器创建并创建视图以提供动态内容(具有扩展名的文件.css.erb.js.erb)。您只需要包含在您的视图或布局文件中<%= javascript_path '/my_assets/things_dynamically_generated.js' %>

于 2013-03-13T06:13:45.957 回答
-1

这听起来像是一个 XY 问题。

原则 1:构建必须是确定性的,并且独立于每个环境的配置。

原则 2:静态资产编译必须是构建的一部分。

您应该转向拥有纯静态资产。您可以使用 ERB,但只是调用诸如 之类的方法asset_path,这些方法是确定性的,并且在给定相同代码库的情况下会产生相同的结果。您可以将基于配置的数据或行为放在那里,但前提是数据或行为在所有部署(开发、测试、暂存、qa、pre-prod 和 prod)中都相同。

来自每个环境配置的任何内容都不应进入静态资产。<html>相反,您可以通过 HTTP 标头、元素的属性或其他注入技术来传递它。静态资产代码应该足够聪明,可以在 HTTP 标头或<html>属性中查找注入的数据,并根据注入的数据改变其行为。

至于奖金问题,config.cache_store不是 sprockets、sass、compass 等缓存的控制配置项。

于 2013-03-13T06:43:42.950 回答