pnpm -- 同步依赖项的版本

Nic*_*ick 9 monorepo pnpm

假设我对 Javascript monorepo 有以下限制

\n
-- module a\n   package.json\n-- module b\n   package.json\npackage.json\n
Run Code Online (Sandbox Code Playgroud)\n

模块 A 和模块 B 都依赖于 lodash。

\n

使用pnpm,有什么方法可以确保它们都使用相同版本的lodash?就像在根目录中安装 lodash 并说“使用工作空间根目录中的任何版本”一样?

\n

PS 我知道 pnpm 允许 或 工作区,但根据我的理解(这可能是错误的),只有当依赖项已经是 monorepo \xe2\x80\x94 中的模块而不是第 3 方依赖项时才使用它。

\n

Slb*_*box 7

您可以使用overrides您的字段package.json来实现此目的。

https://pnpm.io/package_json#pnpmoverrides

{
  "pnpm": {
    "overrides": {
      "lodash": "4.17.20"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Yarn 中也存在类似的功能,称为resolutions. 显然存在一些差异,尽管我不熟悉具体细节。该功能已添加到此处。

更新-替代方法

syncpack如果该overrides解决方案不适合您,您也可以尝试。在我的组织中,我们正在慢慢解决syncpack仅由我们的 monorepo 包请求依赖项的问题;这样做的理由是随着时间的推移积累了太多的覆盖。

但为了确保依赖项的版本,overrides仍然是您所需要的。

例如,如果您安装react-dom并且它取决于scheduler并且由于某种原因您需要特定版本scheduler,那么该overrides方法是您唯一的选择 -syncpack无法提供帮助。

  • 谢谢!对于 2022 年来到这里的人来说,链接应该是:https://pnpm.io/package_json#pnpmoverrides (2认同)