Class SpecStore

java.lang.Object
net.fabricmc.loom.spec.SpecStore

public final class SpecStore extends Object
L2 规格层的持久化存储.

配置期只允许读「小数据」,但读不等于可以反复解析:Mojang 的版本清单是全版本清单 (数百 KB ~ MB),而每次配置只需要其中一条;minecraft_info.json 每次配置都要 重新做一次全文 SHA1 校验。这些工作在每次配置、每个子项目上重复,且不随构建结果变化。

本类把「解析结果」与「已验证」这两类状态按输入文件的内容身份落盘,使它们跨 daemon、 跨工作树复用。键由 inputIdentity(Path) 生成,取值来自文件的大小与最后修改时间—— 下载器的落位是原子的,文件不会出现「大小与时间不变而内容改变」的情形。

与 ~/.gradle/caches 下既有的手写就绪标记不同,本目录只存放**纯派生数据**: 任何条目都可安全删除,删除后只是重新解析一次,不影响正确性。因此它不需要参与 构建产物的有效性判定,也不会像产物标记那样在配置期形成「观察 → 填充 → 失效」的循环。

  • Constructor Details

    • SpecStore

      public SpecStore(Path userCache)
  • Method Details

    • inputIdentity

      public static Optional<String> inputIdentity(Path file)
      生成输入文件的内容身份串.

      取大小与最后修改时间而非内容哈希:调用方关心的是「这个文件是不是上次那个」, 而计算内容哈希本身就是要省掉的成本。下载产物一律原子落位,故该组合足以区分代次。

      Parameters:
      file - 输入文件
      Returns:
      形如 size-mtime 的身份串;文件不存在时返回空
    • load

      public Optional<String> load(String namespace, String identity, String discriminator)
      读取已缓存的解析结果.
      Parameters:
      namespace - 逻辑分区(例如 "versions-manifest"),不同用途互不干扰
      identity - 输入身份串,见 inputIdentity(Path)
      discriminator - 同一输入下区分不同查询的额外维度(例如目标 Minecraft 版本)
      Returns:
      缓存内容;未命中时为空
    • store

      public void store(String namespace, String identity, String discriminator, String content)
      写入解析结果.

      原子落位,且失败不抛异常:缓存写不进去只是下次多解析一次, 不应让它成为构建失败的原因。

      Parameters:
      namespace - 逻辑分区
      identity - 输入身份串
      discriminator - 额外维度
      content - 待缓存内容