SyMind / learning

路漫漫其修远兮,吾将上下而求索。
10 stars 1 forks source link

对 npm 依赖的依赖进行更改 #33

Open SyMind opened 2 years ago

SyMind commented 2 years ago

如果你想对 npm 依赖的依赖进行更改,例如,根据已知的安全问题来替换依赖的版本,用 fork 替换现有的依赖,或者确保在任何地方都使用相同版本的包,此时可以使用 npm 的 overrides 配置。

overrides 可以将依赖树中的包替换为其他的版本,或全完替换为其他的包。可以根据需要决定变更的范围。

确保软件包 foo 始终安装为 1.0.0 版本,无论依赖的 package.json 中选择的是哪个版本:

{
  "overrides": {
    "foo": "1.0.0"
  }
}

上面是配置的简写形式,可以使用完整的配置对象形式来覆盖包本身以及包的子依赖。下面的配置让 foo 始终为 1.0.0 版本,同时在 foo 下的任何深度的 bar1.0.0 版本:

{
  "overrides": {
    "foo": {
      ".": "1.0.0",
      "bar": "1.0.0"
    }
  }
}

仅覆盖 bar 下的 foo 包为 1.0.0 版本:

{
  "overrides": {
    "baz": {
      "bar": {
        "foo": "1.0.0"
      }
    }
  }
}

overrides 配置的 key 可以包含版本。仅覆盖 bar@2.0.0 下的 foo 包,让其版本为 1.0.0

{
  "overrides": {
    "bar@2.0.0": {
      "foo": "1.0.0"
    }
  }
}

你不能在 overrides 中配置一个与直接关联的 dependencies 中版本定义不同的包。为了更加容易的处理该限制,你可以 $ 前缀加上包名,来直接引用此包在 dependencies 中的版本定义:

{
  "dependencies": {
    "foo": "^1.0.0"
  },
  "overrides": {
    // 错误,将抛出 EOVERRIDE 错误
    // "foo": "^2.0.0"
    // 正确,版本定义匹配
    // "foo": "^1.0.0"
    // 最佳实践,使用 `$` 前缀引用 `dependencies` 中的版本定义
    "foo": "$foo"
  }
}

注意

overrides 依赖 npm 8.3 以上版本,若 npm 低于该版本可以使用 npm-force-resolutions

参考资料

https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides