在链轮中如何检测资产是否陈旧?
我尝试过以下操作,结果出人意料:
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与ActionView集成,通过自己的缓存使事情变得复杂。如果链轮中的资产是陈旧的并且将在下一次获取时重新加载,我需要一些方法来破坏ActionView的缓存。我不想在我的宝石中镜像sprocket的缓存系统,而是希望只询问链轮关于其资产的状态 - 这似乎完全有可能,只要我能弄明白发生了什么。
答案 0 :(得分:2)
我无法回答如何解决这个问题,但我可以(有信心)告诉你为什么它的表现如此。链轮不仅mtime
来确定陈旧性,它还使用文件本身的摘要。如果最近未更新mtime
,它将首先返回资产,其次如果哈希摘要未更改(对于相关方法,请查看here for dependency_fresh?
)。由于touch
不会更改文件的哈希值,因此Sprockets会认为它很新鲜。
我不太清楚你的目标是什么,所以我不能在这里给出太多建议。使用的依赖关系跟踪大部分都是私有的,但是可能会破解它以强制重置。如果您正在寻找的是在开发宝石时为了本地测试而迫使资产过时的快速方法,您可以考虑为Asset
或ProcessedAsset
创建一个可以使用的猴子补丁刷新旧的mtime
和digest
值。
index
上的assets
方法会在每次调用时创建一个新对象,实际上是当时资产的快照,而当您要求资产时环境会不断刷新 - 查找资产使其在过期时自动刷新该资产。
理论上,这应该有一个非常简单的解决方案 - 只需将您的新呼叫转换为x['path/to/asset'].fresh?(e)
。