Release:https://github.com/pnpm/pnpm/releases/tag/v7.10.0

RFC - Time-based resolution mode:

rfcs/0002-time-based-resolution-mode.md at main · pnpm/rfcs

Docs:https://github.com/pnpm/pnpm.github.io/blob/main/docs/npmrc.md#resolution-mode

# .npmrc
resolution-mode=time-based

time-based 解析流程

依赖关系将按照以下方式解析:

  1. 直接依赖解析为最低版本。
    1. 例如,foo@^1.1.0,则安装 1.1.0 版本。
    2. 依赖中的 ~ ^ 等 prefix 将失效。
  2. 子依赖(间接依赖)只会安装直接依赖发布之前的版本。
    1. 只有直接依赖发生变更才会更新子依赖(间接依赖)。

    2. 子依赖(间接依赖)的发布时间不能比直接依赖新。

    3. 例如,A 依赖 B@^3.1.0A 发布了 1.0.0 版本,此时版本 B3.1.0。后来 B 发布了新版本(3.2.0

      1. highest 模式。下次安装 A 时,简介依赖 B 则会安装 3.2.0 版本。如果 B 发了一个有问题的版本,安装 A 的业务就挂了。
      2. time-based 模式。下次安装 B 时,只能安装 [email protected] 发布之前的 B 发布的 3.1.0 版本。

      Untitled

发布时间取值

版本发布信息在包元数据的 time 字段中。

例如:[email protected] 发布于 "2022-08-14T01:23:41.730Z",在这个时间上加一些 delta 最后得到发布时间 T。

delta 的存在是因为某些 monorepos 发布顺序是随机的,所以某些依赖包会在它所依赖的包发布之后发布

缺陷

  1. 不遵守 semver 语义,所有直接依赖的版本需要手动控制,成本大。
  2. 子依赖(间接依赖)受限于直接依赖,若子依赖(间接依赖)之后的版本修改了 bug,仍然按照有 bug 的版本。
  3. 时间取值 T = 直接依赖发布时间 + delta,delta 这段时间内子依赖(间接依赖)发布了多个版本等情况
  4. time-based 模式依赖于 NPM 完整元数据,存在数据拿不全。
  5. 排查全部包的每一个版本信息,需要花费大量时间。