Files
2026-07-13 21:35:53 +08:00

3.1 KiB
Raw Permalink Blame History

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