尽管有变化,Rails 仍使用缓存的 application.css

Posted

技术标签:

【中文标题】尽管有变化,Rails 仍使用缓存的 application.css【英文标题】:Rails using cached application.css despite changes 【发布时间】:2011-10-25 22:14:12 【问题描述】:

我有一个使用 SASS 的 Rails 3.1 应用程序。 application.css.scss 文件如下所示:

@import 'reset.css';
@import '960.css';
@import 'pages/master.css.scss';

每当@imported 文件之一发生更改时,我有一个监视脚本会触及application.css.scss

有一段时间,此设置运行良好。自上周以来(我不知道为什么),尽管我尝试重新启动应用程序、重新触摸 application.css.scss 等,Rails 一直在为网页提取 application.css 的缓存版本。我也删除.sass-cache 无效。

有什么想法吗?

【问题讨论】:

您的应用程序清单不应该自己自动重建文件吗?你在development 跑步对吗? 你能检查一下你的application.css的修改时间吗?它可能会设置为将来的某个日期。 【参考方案1】:

我遇到了同样的问题。我停止了服务器,执行了rm -fr tmp/cache,我的css文件终于重建了。

【讨论】:

呃,调试起来太痛苦了。它突然冒出来了。感谢您的提示,总救命稻草。【参考方案2】:

首先,通常的缓存清除完整性检查可能会有所帮助。清除浏览器缓存。清除服务器文件缓存(如果您在开发/测试中或在生产中负担得起)和 sass-cache :

rake tmp:cache:clear
rm -fr tmp/sass-cache #or 'compass clean' if using compass

如果这没有帮助,也许 Rails 在其他地方编译了 ANOTHER application.css(缓存清除没有删除)?

例如,我出于调试目的运行 compass watch app/assets/stylesheets/application.css.scss,它创建了一个 public/assets/application.css 文件,由于它位于 public/ 中,阻止任何新的 application.css .scss 样式表的变化不会被 Rails 注意到。一旦我删除它,应用程序再次从 .scss 样式表中提取。这只是意外覆盖文件创建的一个示例。尝试在整个应用程序目录上运行查找以查找任何生成的 application.css 文件,在缓存清除后执行此操作以避免这些文件出现在您的结果中。

(仅供参考,为了避免我的具体问题,我现在运行 compass watch 并将 --css-dir 指向缓存以防止我的问题

$ compass watch app/assets/stylesheets/application.css.scss  --css-dir tmp/cache/

)

【讨论】:

【参考方案3】:

在开发中运行 rake assets:precompile 后,我遇到了类似的问题。也许 Rails 正在提供来自public/assets 的预编译资产?试着清理一下。

您不应该在开发中接触 aplication.css.scss,只要 @included 文件之一发生更改,rails 就会提供新内容。

另外,请确保您在config/environments/development.rb 中有以下内容

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

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

【讨论】:

【参考方案4】:

如果您在 application.scss 中将 @import 'file.css'; 替换为 @import 'file';,则应该允许它在开发模式下自动刷新

在删除文件扩展名之前,我一直在使用 bin/rails tmp:clear

【讨论】:

这终于为我修好了!从导入中删除文件扩展名后,CSS 更改现在会在页面刷新时自动获取。 也适用于我的 scss 而不是 css!谢谢!【参考方案5】:

为了清除资产管道缓存,暴力破解 rm -rf tmp/* 将 够了。这肯定修复了一些其他无法解释的 CSS 和 在我的经验中,javascript 出现了故障。作为预防措施,它 升级宝石后清除缓存可能也是一个好主意或 更改资产管道配置,尽管这可能只是 迷信。

最后,如果您正在尝试使用 rake 资产:在您的 开发环境(在后面的文章中详细介绍),您还将 想 rm -rf public/assets/* 之后清理它。

http://blog.55minutes.com/2012/02/untangling-the-rails-asset-pipeline-part-1-caches-and-compass/

【讨论】:

【参考方案6】:

您可以通过执行以下操作来调用 Rails automagic 缓存清除:

    将 SASS 文件重命名为部分文件,即使用下划线前缀。例如。 _master.css.scss 从导入中删除扩展名。您可以保留路径,但排除下划线。例如。 @import 'pages/master';

现在您可以在 master 中进行更改并让它们反映出来,而无需手动弄乱缓存。

(注意:我使用的是 Rails 4.2)

【讨论】:

天哪,这是我 6 小时以来一直在寻找的答案!你比我早 14 天回答了一个 9 岁的问题,这一定是某种奇迹! (Rails 5.0) 有人知道这是为什么吗?【参考方案7】:

我今天在使用 Rails 6.0.3.1 时遇到了类似的问题。我不得不重新触摸application.scss,这样rails 才不会使用缓存的版本。

运行rake tmp:cache:clear 有帮助,但很烦人,因为每次更新任何部分 scss 文件时都必须运行该命令。 :(

【讨论】:

【参考方案8】:

随机我遇到了与使用 twitter bootstrap 和 application.css.scss 相关的缓存问题。基本上我将 application.css.scss 更改为普通的 application.css 并解决了我的问题。也许这可以帮助你?如果你还没有弄清楚。

【讨论】:

如果你的 application.scss 中有变量或 Sass 将不起作用!【参考方案9】:

我遇到了这个问题,但我实际上是将 css 放入 application.css,而不是放入它包含的文件中。我清除了 application.css 以简单地包含我所有的 css。所以,我的 application.css 现在看起来像这样:

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the top of the
 * compiled file, but it's generally better to create a new file per style scope.
 *
 *= require_self
 *= require 'bootstrap.min'
 *= require 'global'
 */

每当我更改其中一个包含的文件(例如 global.css)时,我的更改都会反映出来

【讨论】:

以上是关于尽管有变化,Rails 仍使用缓存的 application.css的主要内容,如果未能解决你的问题,请参考以下文章

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

Android:尽管设置了 MIME 类型,但 PDF 文件仍被隐藏

从 Rails 资产管道中清除缓存

尽管定位了正确的SDK,Android App仍无法从Play商店安装。为什么?

WeakReference 是不是提供良好的缓存?

尽管有几个 `try`-`catch` 块,但仍获得 UnhandledPromiseRejectionWarning