#21188·eslint

缓存存储运行后的文件散列, 并带有时间结果, 所以运行时编辑的文件会毒害缓存

作者: marcospgp创建于 2026年8月4日更新于 2026年9月16日
标签Stale

环境

节点版本:v24 (通过 Bun 1.3.x 跑道,同样在平地节点下复制) npm 版本: n/a (bun) 调用 ESLint版本:10.7.0 (文件输入-cache 8.0.0,平面-cache 4.0.1) 操作系统: macOS 15

你用什么解码器?

默认( Espree)

你做了什麽?

我们在一个单列中运行“slint.-cache-cache-strategy communication”,编辑器和其他工具在进行一连串运行时不断写入文件。 跑步需要一分钟 所以中跑写作是例行公事

你想怎样?

缓存条目只应服务于其内容与实际被所嵌入的内容相匹配的文件.

到底发生了什么?

缓存可以永久存储一款新内容的散列,并配以由更古老内容产生的林特结果. 之后,后跑服务于错误结果(对已不存在的代码的存储错误,或对现在有问题的代码的 stale clean judge),并一直服务到缓存被删除,因为从缓存的角度来说,该条目是有效的.

这个机制处于文件输入-缓存的“调和()”中,ESLint在运行结束时使用。 `校正 ()' 从磁盘上重新读取所有文件, 然后计算其校验和, 但文件被倒入时, 可能是在几分钟前, 它同时储存的“ meta.results” 被附加:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? // 文件输入-缓存 8.0.0,缓存.js var meta = 使用检查和

  • me. Get MetaForFileUsing CheckSum( cacheEntry) // 现在重新读取文件 : me. Get MetaForFileUsingMtimeAndSize(缓存); 缓存. setKey( entryName, meta; // meta. results 仍然来自 lint 时间

因此,任何写到其林特和运行结束之间的源文件都会产生一个条目,其散列表示"当前内容",而其结果则描述了之前的内容. `int-result-cache.js'然后在下一轮中接受:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
cast 已更改 = 文件 Descriptor. changed = \ 文件 Descriptor.meta.hashOfConfig!==========================================================
如果(已更改)返回为无效;
返回文件Descriptor.meta.results; 页面存档备份,存于互联网档案馆

`-cache-strategy内容 ' 无法防止这种情况,因为所储存的校验和是新内容的校验和。 mtime策略有相同形状的洞,因为mtime也在调和时被读取. 注意触发器是任意并发的写入器(一个编辑器保存,一个前题,一个git取出),而不是第二个ESLint进程,因此环绕ESLint本身的锁不会关闭.

最小复制时间:

  1. 启动`slint.-cache-cache-strategy 内容 ' ,其范围足够大,运行需要一段时间。
  2. 在文件被剪贴后但在运行完成前,编辑该文件,以便其错误判断会改变(暗示或去除错误)。
  3. 让跑步结束。 缓存现在持有新内容的散列和旧内容的结果.
  4. 再次运行ESLint:它为当前内容报告旧结果,并在随后的每次运行中继续这样做.

我们在实践中打到它 是一个细小的失败 描述源 不再在磁盘上, 它幸存了多少次重跑 . . . . . . .