Nb
Study
.com
🔍 请输入搜索关键字

package.json中的overrides和resolutions字段是什么意思?

nbstudy 发表于 2024-07-08 09:58:19

在看一些开源项目是,package.js on 中常看到overridesresolutions字段,具体是什么意思呢?
例如:

javascript 复制代码
// overrides
{
  "overrides": {
    "foo": "1.0.0"
  }
}
// overrides
"resolutions": {
  "nitropack": "link:.",
  "undici": "^6.19.2"
},

如果一个项目只依赖一个包的一个版本,只需要在package.json 的声明就可以了. 但是如果项目中同时依赖了两个不同包,而这这两个不同的包,又分别依赖的 foo 包的不同版本,这时候就涉及到需要进行版本重写(overrides/resolution)了。

术语说明:
一级依赖:直接声明在 package.json 的 (dev | optional | peer) dependencies 中的依赖。
子依赖:一级依赖的依赖,无法由应用开发者直接指定版本。
嵌套重写:指仅重写某个依赖下的一级依赖或者子依赖(限制 Scope 重写依赖版本)。

其中,npm 支持overrides字段,yarn支持 resolutions字段,pnpm 两个字段都支持,一般使用 resolutions字段。

override

对override来说,常用规则如下:

javascript 复制代码
{
  "overrides": {
    //foo is always installed as version 1.0.0 no matter what version your dependencies rely on
    "foo": "1.0.0"
    // 将 foo 替换成 dependencies 中声明的版本
    "foo": "$foo",
    // 表示仅将 1.0.0 的 foo 版本重写到 1.0.1
    "foo@1.0.0": "1.0.1", 
    // 嵌套中,用 “.“ 代表嵌套的包本身
    "foo": {
      ".": "1.0.0",
      // 重写 foo 下级所有的 bar 依赖版本至 1.0.0
      "bar": "1.0.0"
    }
  }
}

关于overrides字段详解介绍 https://docs.npmjs.com/cli/v10/configuring-npm/package-json#overrides

resolutions规则

在pnpm 中 pnpm.overridesresolutions 字段的功能相同,后者是前者的别名,主要是为了兼容resolutions