【问题标题】:Detecting stale asset with sprockets?用链轮检测陈旧的资产?
【发布时间】:2014-02-11 09:37:20
【问题描述】:

在 sprockets 中,我如何检测资产是否过时?

我尝试了以下方法,结果出乎意料:

e = Rails.application.assets # sprockets env
x = Rails.application.assets.index

e['path/to/my/asset'].body
#=> prints asset

e['path/to/my/asset'].fresh?(x)
#=> true


# modify the asset file (to change mtime and digest)


e['path/to/my/asset'].fresh?(x)
#=> true

#!? Why wasn't that false?

缓存机制让我感到困惑。此外,在检查资产时,它告诉我mtime 是原始值,而不是我修改上面文件的时间。有人可以解释这里发生了什么以及我如何检测陈旧资产吗?我希望在我的 gem 中利用 sprockets 依赖/缓存系统。

我的目标:

我正在创建一个 gem,它可以在管道中查找资产并从中生成一些内容。这个 gem 与 A​​ctionView 集成,它通过自己的缓存使事情变得复杂。如果 sprockets 中的资产过时并且将在下一次提取时重新加载,我需要一些方法来破坏 ActionView 的缓存。而不是在我的 gem 中镜像 sprocket 的缓存系统,我希望只是询问 sprocket 其资产的状态——这似乎完全有可能,只要我能弄清楚发生了什么。

【问题讨论】:

    标签: ruby-on-rails caching asset-pipeline sprockets


    【解决方案1】:

    我无法回答如何解决这个问题,但我可以(有信心)告诉你它为什么会这样。 Sprockets 不仅mtime 确定陈旧性,它还使用文件本身的摘要。如果mtime 最近没有更新,它将首先将资产返回为新鲜的,其次如果哈希摘要未更改(有关相关方法,请查看here for dependency_fresh?)。由于touch 不会改变文件的哈希值,Sprockets 会认为它是新鲜的。

    我不太清楚你的目标是什么,所以在这里我不能给出太多建议。使用的依赖跟踪主要是私有的,但可以绕过它来强制重置。如果您正在寻找一种在开发 gem 时为了本地测试而强制资产陈旧的快速方法,您可以考虑为 AssetProcessedAsset 创建一个可以刷新旧 @ 的猴子补丁987654328@ 和 digest 值。


    编辑 - 我做了更多的挖掘工作,我想我发现了一些有用的东西。 assets 上的 index 方法在每次调用时都会创建一个新对象,实际上是当时资产的快照,而当您向其请求资产时,环境会不断刷新 - 查找资产会导致它如果该资产陈旧,则自动刷新该资产。

    理论上,这应该有一个非常简单的解决方案 - 只需将您的新呼叫转为 x['path/to/asset'].fresh?(e)

    【讨论】:

    • 泡泡,谢谢你的回答。我编辑了这个问题,以反映我实际上修改了文件(不仅仅是触摸它),因为我知道摘要哈希。我将更新问题以进一步讨论我的目标。
    • 嗯。我想我实际上对我原来的答案挖得太深了。当您像现在一样查找资产时,实际上是在创建一个新资产——Sprockets::Environment 上的 [] 查找会创建一个新资产,自然而然,新创建的资产永远不会不新鲜。如果您可以使参考保持有效,那将是可行的,但在每种情况下可能并不方便。我会再挖掘一点,然后回复你。
    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 2016-10-18
    • 2013-01-19
    • 2015-01-15
    • 2012-12-20
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多