package.json中的overrides和resolutions字段是什么意思?
在看一些开源项目是,package.js on
中常看到overrides
和resolutions
字段,具体是什么意思呢?
例如:
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.overrides
和 resolutions
字段的功能相同,后者是前者的别名,主要是为了兼容resolutions
。