Rails 3.1资产管道开发环境下的CSS缓存

36

我有点困惑,因为似乎application.css文件在两个地方被引用了,一次是从资源清单中列出的,另一次是它的缓存。所以,即使我删除一个单独的文件,它仍然似乎存在于application.css文件中。

application.css(源代码)

/*
*= require twitter/bootstrap
*= require_self
*= require_tree ./common
*= require_tree ./helpers
*/

这段代码按预期工作,并在开发模式下输出所有相关的单个文件。

development.rb

  # Do not compress assets
  config.assets.compress = false

  # Expands the lines which load the assets
  config.assets.debug = true

输出

<link href="/assets/twitter/bootstrap.css?body=1" media="screen" rel="stylesheet" type="text/css" />
<link href="/assets/application.css?body=1" media="screen" rel="stylesheet" type="text/css" />
<link href="/assets/common/announcement.css?body=1" media="screen" rel="stylesheet" type="text/css" />
<link href="/assets/common/button.css?body=1" media="screen" rel="stylesheet" type="text/css" />
<Blah blah>

application.css(输出)

这应该是空的吗?因为我的application.css文件中只有清单而没有实际的CSS,但我得到了所有合并后106kb的代码。

如果我删除common目录中的文件,它不会消失。它不再在输出中列出,但CSS仍然从application.css中显示出来。


2
我在CSS和JS方面都遇到了完全相同的问题,无法解决。下面的“答案”没有解决这个问题。我现在只在开发模式下工作。如何关闭合并和压缩?这导致我的jQuery插件运行两次,CSS也重复了。 - dsaronin
2
在config/environments/development.rb文件中,如果我将config.assets.debug设置为false,则不会发生双重加载,因为不会生成额外的javascript/stylesheet标签。但我不知道是否动态地对合并的文件进行更改。 - dsaronin
2
你有没有找到解决方法,@holden?我也遇到了同样的问题,正在拼命地尝试弄清楚它。 - Josh
10个回答

41

我以前也遇到过这样的问题。这是在我预编译资源之后发生的,它会在public文件夹和apps目录中的application.css文件中查找。 我不确定如何解决开发模式下不断发生的问题,但如果您删除/public/assets目录,它应该可以解决。

检查一下你是否有public/assets文件夹,如果有并且它已经填满了,那就可能是你看到重复的原因。


2
我应该如何在推送生产更改并返回开发之间隐藏公共文件夹中的资产?我能否在开发中从路径中删除它? - holden
4
我已经删除了 application.jsapplication.css 但是保留了有指纹版本的文件。看起来对我来说运行正常。 - ZMorek
删除我的application.css和application.css.gz解决了问题。谢谢。 - Kleber S.
3
我真的很惊讶需要这样一个解决方案。我编译约10-15个文件,现在每个文件在dev中都被作为压缩和未压缩的文件提供,造成了混乱。这是否意味着我每次都必须编写脚本来清理application.js、application.css和所有其他压缩文件?这真的没有多少意义。 - Matthew O'Riordan
1
如果您使用Capistrano进行部署,您可以在生产服务器上设置共享文件夹以存储资源,或者在每次部署后钩取以预编译资源。这样,您就不必在本地预编译资源,并且可以保持本地机器的public/assets干净,避免冗余包含。我并不是在假装这是理想的 - 对于我来说,任何对资源管道的调试都很麻烦 - 只是这是一个相对干净的解决方法。 - evanrmurphy
显示剩余3条评论

38

目前(2012-09-24),Rails / Sprockets存在一个错误,导致其无法正确检测导入的文件。

这个问题应该在Rails 3.2.9及更高版本中得到解决,但与此同时,您可以按照以下方法解决:

  1. 关闭Rails实例
  2. rm -rf tmp/cache
  3. 启动Rails实例

现在您应该能够看到正确的CSS样式。


1
Peter,请问你能提供这个bug的链接吗? - Brent Matzelle
只是想指出这正是我需要做的。在development.rb中设置开关后清除缓存就可以解决问题了。 - FireDragon
我在进行 gem 更改时,Rails 仍在运行,这导致 twitter-bootstrap-rails 的 CSS 变得陈旧。删除了文件夹,问题解决了。谢谢。 - ZMorek
同时通过按下CTRL+F5(Mac上是Cmd+Shift+R)来刷新浏览器缓存。 - Sergey Makridenkov

10

很遗憾,这对我没起作用,它仍然直接从 /public/assets 提供了 application.js 的压缩版本。 - Matthew O'Riordan
抱歉 @Agustin,这个解决方案确实有效。但是,所有不属于资产管道的资产都不再提供服务(例如favicon.ico和字体)。看来我必须为这些资产想出一个解决方案。 - Matthew O'Riordan
这个答案提出了另一种方法:为开发环境分配一个虚拟资产文件夹。https://dev59.com/cWsz5IYBdhLWcg3wR1kc#11587288 - Mark Berry
重启服务器后。 - Bruno

7
@Agustin的解决方案对我有帮助,但是你需要做以下几点:
  1. 删除 /tmp/cache/assets 中的所有内容。

  2. 在 development.rb 或 test.rb 中添加 config.serve_static_assets = false(感谢 @Agustin)。

  3. 重新启动服务器。

  4. 确保您的 application.js / .css 没有被浏览器缓存。前往 http://localhost:3000/assets/application.js?body=1,按下 ctrl+f5 强制刷新(你也可以尝试在末尾添加随机参数:http://localhost:3000/assets/application.js?body=1&rnd=12343)。如果仍然无法刷新,您需要清除浏览器缓存。

跳过以上任何一步都会返回已缓存的 application.js / .css 文件,与您单独修改的文件冲突。


天啊,这真是让人烦恼... 还没有运气。 - Breno Salgado
有没有在公共区域缓存的内容?检查页面并确保application.css不会被重复提供(或包含代码)...我知道你的感受,这真的很烦人。 - Abdo

4
我发现最好的方法是删除 tmp/cache/* 文件夹中的内容...

3

对我们有帮助的是设置 'config.assets.debug = false'

这将不再将HTML中包含的CSS设置为href="/assets/bootstrap-new.css?body=1",而是设置为href="/assets/bootstrap-new.css",我认为这就是问题所在。


1
我曾经遇到过同样的问题。尽管清除了tmp/cache和public/assets,但是压缩后的application.css仍然被缓存并从某个地方提供服务,我的个别css文件更改没有得到服务。
这对我有用: 在application.css中删除*= require_self这一行
重新启动服务器
这似乎会删除缓存,如果您在浏览器源中单击application.css,则不再会看到压缩版本
*= require_self替换回文件并继续开发。

0

我知道这是一个老问题,但对我有效的一个解决方法是我有nginx代理到我的开发环境,并且在配置中有一个location ~ ^/(assets)/块。要么将其注释掉,要么尝试重新启动nginx以使缓存失效。如果您正在开发,则可能只需完全将其注释掉。

我花了太多时间来排除故障,直到我记起来为止。


0

对于我来说,还需要一个最后的步骤,但我已经解决了。这是我所做的:

  1. 关闭Rails服务器
  2. rake assets:clean
  3. rake tmp:clear
  4. 重新启动Rails服务器

然后,我在Google Chrome中刷新了屏幕,但仍然无法正常工作。所以,我启动了Firefox,它实际上可以工作了。这意味着Chrome在浏览器中缓存了旧文件。因此,我清除了Chrome中的浏览器缓存,然后它就可以工作了!


-5

当在生产环境中运行应用程序时,资产的工作效果更好,您只需加载包含所有文件且已压缩的application.css即可减少服务器请求,这样压缩的样式的application.css将被缓存。

http://guides.rubyonrails.org/asset_pipeline.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接