开发中的 rails 3.1 资产管道 css 缓存

Posted

技术标签:

【中文标题】开发中的 rails 3.1 资产管道 css 缓存【英文标题】:rails 3.1 asset pipeline css caching in development 【发布时间】:2011-12-30 20:00:42 【问题描述】:

我有点困惑,因为 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 长。

IE 如果我删除公共目录中的文件,它不会消失。它不再列在输出中,但 css 仍然出现在 application.css 中

【问题讨论】:

我在 css 和 js 上都有完全相同的问题。无法弄清楚。下面的“答案”没有解决这个问题。我现在只在开发模式下工作。如何关闭连接和缩小?这导致我的 jquery 插件运行两次,CSS 加倍。 在 config/environments/development.rb 中,如果我设置 config.assets.debug = false,则不会发生双重加载,因为没有生成额外的 javascript/stylesheet 标签。但是,我不知道是否正在对合并文件进行动态更改。 你有没有找到解决这个@holden的方法?我也有同样的问题,正在拼命想办法解决。 【参考方案1】:

在生产环境中运行应用程序时,资产会更好地完成它们的工作,然后您将只加载包含所有文件并压缩的 application.css,以减少服务器请求和压缩后的 application.css样式将被缓存。

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

【讨论】:

【参考方案2】:

我以前遇到过这样的问题。这是在我预编译了公共文件夹和应用程序目录中的 applcation.css 之后的资产之后引起的。我不知道如何修复它,这样它就不会在开发模式下继续发生,但如果你删除你的 /public/assets 目录,它应该会修复它。

检查您是否有一个 public/assets 文件夹,如果有并且它已满,这可能就是您看到双倍的原因。

【讨论】:

我应该如何在推送生产更改然后返回开发之间隐藏公用文件夹中的资产?我可以以某种方式将它从我的开发路径中删除吗? 我删除了我的application.jsapplication.css,但留下了指纹版本。看起来它对我有用。 删除我的 application.css 和 aplication.css.gz 解决了这个问题。谢谢。 我真的很惊讶需要这种解决方案。我编译了大约 10-15 个文件,这些文件中的每一个现在都在 dev 中作为压缩和未压缩文件提供,从而造成严重破坏。这是否意味着我每次都必须编写一个脚本来清理 application.js、application.css 和所有其他压缩文件?这真的没有多大意义。 如果您使用 Capistrano 进行部署,您可以在生产服务器上为您的资产设置一个共享文件夹,或者在每次部署后在生产环境中预编译资产的挂钩。这样您就不必在本地预编译资产,并且可以在本地计算机上保持 public/assets 干净以避免多余的包含。我并没有假装这是理想的 - 资产管道需要任何陪审团操纵对我来说很麻烦 - 只是这是一个相对干净的解决方法。【参考方案3】:

你可能想看看

https://***.com/a/7854902/686460

“将 config.serve_static_assets = false 添加到 development.rb 将阻止从 /public/assets 加载文件”

这对我有用。

【讨论】:

不幸的是,这对我不起作用,它仍然直接从 /public/assets 提供 application.js 的压缩版本 哎呀,对不起@Agustin,这个解决方案确实有效。但是,不再提供不属于资产管道的所有资产(例如 favicon.ico 和字体)。看来我必须为这些资产想出一个解决方案。 这个答案提出了另一种方法:为开发环境分配一个虚拟资产文件夹。 ***.com/a/11587288/550712 之后重启服务器【参考方案4】:

@Agustin 的解决方案可以帮到我,但您需要做以下几件事:

    删除 /tmp/cache/assets 中的所有内容

    config.serve_static_assets = false 添加到 development.rb 或 test.rb(感谢 @Agustin)

    重新启动服务器。

    确保您的 application.js / .css 未缓存在浏览器中。转到http://localhost:3000/assets/application.js?body=1 并按 ctrl+f5 强制刷新(您也可以尝试在末尾附加随机化参数:http://localhost:3000/assets/application.js?body=1&amp;rnd=12343 如果你得到其他东西并且 ctrl+f5 仍然没有帮助,你需要清除浏览器的缓存。

跳过这两个步骤中的任何一个都会返回一个缓存的 application.js / .css,这与我在单个文件中的更新冲突。

【讨论】:

天哪,这很烦人......这里还没有运气 是否有公开缓存的内容?检查页面并确保 application.css 没有被提供两次(或包含代码)......我知道你的感受,这很烦人。【参考方案5】:

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

这应该在 rails 3.2.9 及更高版本中修复,但与此同时,您可以按以下方式解决它:

    杀死 rails 实例 rm -rf tmp/缓存 启动 rails 实例

您现在应该会看到正确的 css。

【讨论】:

彼得,你能提供这个错误的链接吗? 只是想指出这正是我需要做的。在 development.rb 中设置开关后清除缓存就可以了 我在进行 gem 更改时运行了 rails,这导致 twitter-bootstrap-rails 有陈旧的 css。销毁文件夹,全部修复。谢谢。 也可以通过 CTRL+F5 刷新浏览器缓存(Mac 上为 Cmd+Shift+R)【参考方案6】:

对我有用的最好方法是删除 tmp/cache/* 目录的内容...

【讨论】:

【参考方案7】:

我遇到了同样的问题。尽管清除了 tmp/cache 和 public/assets 缩小的 application.css 仍然被缓存并从某个地方提供服务,并且我对单个 css 文件的更改没有得到服务。

这对我有用: 在 application.css 中删除行 *= require_self

重启服务器

这似乎删除了缓存,如果您在浏览器源代码中单击 application.css,您将不再看到缩小版本

*= require_self 替换回文件中并继续开发。

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我需要最后一步,但我已经解决了。这是我所做的:

    关闭 rails 服务器 rake assets:clean rake tmp:clear 重启 Rails 服务器

然后,我在 Google Chrome 中刷新了我的屏幕,但它仍然无法正常工作。所以,我启动了 Firefox,瞧,它确实在工作。这意味着 Chrome 正在缓存浏览器中的旧文件。所以,我随后清除了 Chrome 中的浏览器缓存,并且成功了!

【讨论】:

【参考方案10】:

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

在我想起来之前,我浪费了太多时间来解决这个问题。

【讨论】:

以上是关于开发中的 rails 3.1 资产管道 css 缓存的主要内容,如果未能解决你的问题,请参考以下文章

>=Rails 3.1 如何在资产管道中包含 IE 特定的 YAML-CSS 文件

Rails 3.1 资产管道和缓存

无法将凉亭组件 css 添加到 Rails 4.2 中的资产管道中

如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?

Rails 3.1 资产管道:如何加载特定于控制器的脚本?

Rails 3.1 资产 - 奇怪的开发服务