我已经阅读了很多帖子,文章和问题。 Rails资产管道的答案 但我仍然没有想出如何完全关闭缓存。
我们正在使用Rails 3.2.11并且在我们的实验室环境中(类似于开发)我们遇到了问题,因为即使我们没有在资产管道中预编译或指纹识别资产,它们仍然被缓存在Rails(Rack?)缓存。这很烦人,因为某些资产是基于其他配置而更改的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/
?
答案 0 :(得分:8)
关闭资产缓存:
config.assets.cache_store = :null_store
请注意,这是config。 assets .cache_store而不是Rails config.cache_store。
另请注意,Sass为已编译的样式表提供了单独的缓存,默认情况下为tmp/cache/sass
,如果要禁用,则必须单独执行此操作:
config.sass.cache = false
要回答红利问题,Rails Guide说:
Sprockets将使用默认的Rails缓存存储来缓存开发和生产中的资产。
我认为它们意味着将使用配置的 Rails缓存存储。我错了,它使用默认缓存,除非您明确更改资产缓存。
答案 1 :(得分:-1)
要完全禁用资产管道,可以在环境文件中添加此指令:
config.assets.enabled = false
但是如果你仍然希望享受静态JS和CSS的资产管道编译和缓存,同时使用ERB文件作为动态资产,你可以创建一个my_assets_controller
并为该控制器创建视图。提供动态内容(扩展名为.css.erb
和.js.erb
的文件)。您只需要在视图或布局文件<%= javascript_path '/my_assets/things_dynamically_generated.js' %>
答案 2 :(得分:-1)
这听起来像是XY问题。
原则1:构建必须是确定性的,并且与每个环境的配置无关。
原则2:静态资产编译必须是构建的一部分。
你应该转向拥有纯粹的静态资产。您可以使用ERB,但只是调用asset_path
之类的方法,这些方法是确定性的,并且在给定相同代码库的情况下会产生相同的结果。您可以在其中放置基于配置的数据或行为,但前提是所有部署(dev,test,staging,qa,pre-prod和prod)中的数据或行为相同。
来自每个环境配置的任何内容都不应该进入静态资产。相反,您可以在HTTP标头,<html>
元素中的属性或其他注入技术中传递它。静态资产代码应足够智能,以便在HTTP标头或<html>
属性中查找注入的数据,并根据注入的数据更改其行为。
至于奖金问题,config.cache_store
不是链轮,sass,指南针等缓存的控制配置项。