3.1 KiB
3.1 KiB
name, description
| name | description |
|---|---|
| pnpm-overrides | 强制指定依赖(含传递依赖)的版本 |
pnpm Overrides
Overrides 机制允许你强制指定包的特定版本,包括传递依赖。适用于修复安全漏洞或兼容性问题。
基本语法
在 pnpm-workspace.yaml(推荐)或 package.json 中定义 overrides:
在 pnpm-workspace.yaml 中(推荐)
packages:
- 'packages/*'
overrides:
# 覆盖某个包的所有版本
lodash: ^4.17.21
# 覆盖特定版本范围
"foo@^1.0.0": ^1.2.3
# 覆盖嵌套依赖
"express>cookie": ^0.6.0
# 替换为不同的包
"underscore": "npm:lodash@^4.17.21"
在 package.json 中
{
"pnpm": {
"overrides": {
"lodash": "^4.17.21",
"foo@^1.0.0": "^1.2.3",
"bar@^2.0.0>qux": "^1.0.0"
}
}
}
Override 模式
覆盖所有实例
overrides:
lodash: ^4.17.21
强制所有 lodash 安装使用 ^4.17.21。
覆盖特定父级版本
overrides:
"foo@^1.0.0": ^1.2.3
仅当 foo 请求的版本匹配 ^1.0.0 时才覆盖。
覆盖嵌套依赖
overrides:
"express>cookie": ^0.6.0
"foo@1.x>bar@^2.0.0>qux": ^1.0.0
仅在 cookie 作为 express 的依赖时才覆盖。
替换为不同的包
overrides:
# 将 underscore 替换为 lodash
"underscore": "npm:lodash@^4.17.21"
# 使用本地文件
"some-pkg": "file:./local-pkg"
# 使用 Git
"some-pkg": "github:user/repo#commit"
移除某个依赖
overrides:
"unwanted-pkg": "-"
- 将该包完全移除。
常见用例
安全修复
强制使用打了补丁的有漏洞包版本:
overrides:
# 修复传递依赖中的 CVE
"minimist": "^1.2.6"
"json5": "^2.2.3"
去重依赖
当安装多个版本时强制使用单一版本:
overrides:
"react": "^18.2.0"
"react-dom": "^18.2.0"
修复对等依赖问题
overrides:
"@types/react": "^18.2.0"
替换已废弃的包
overrides:
"request": "npm:@cypress/request@^3.0.0"
Hooks 替代方案
对于更复杂的场景,可使用 .pnpmfile.cjs:
// .pnpmfile.cjs
function readPackage(pkg, context) {
// 覆盖依赖版本
if (pkg.dependencies?.lodash) {
pkg.dependencies.lodash = '^4.17.21'
}
// 添加缺失的对等依赖
if (pkg.name === 'some-package') {
pkg.peerDependencies = {
...pkg.peerDependencies,
react: '*'
}
}
return pkg
}
module.exports = {
hooks: {
readPackage
}
}
Overrides 与 Catalogs 对比
| 特性 | Overrides | Catalogs |
|---|---|---|
| 影响范围 | 所有依赖(含传递依赖) | 仅直接依赖 |
| 使用方式 | 自动生效 | 需显式引用 catalog: |
| 目的 | 强制版本、修复问题 | 版本管理 |
| 粒度 | 可定位到特定父级 | 仅包级范围 |
调试
检查已解析的版本:
# 查看已解析的版本
pnpm why lodash
# 列出所有版本
pnpm list lodash --depth=Infinity