如何确保 Javascript monorepo 中重复依赖项的版本一致性?

问题描述 投票:0回答:1

我有一个 Javascript (Typescript) monorepo。我的每个包都有自己的

package.json
,它定义了依赖关系。其中一些外部依赖项可能会在多个包中重复。

repo/
├── package.json
├── packageA
│   └── package.json
│         dependencies: [
│           "libA": "^1.0.0",
│           "libB": "^1.0.0"
│         ]
├── packageB
│   └── package.json
│         dependencies: [
│           "libC": "^1.0.0"
│         ]
└── packageC
    └── package.json
          dependencies: [
            "libA": "^1.0.0" <-- duplicated with packageA
          ]

有时(例如,使用

yarn workspace packageC libA
时)我会无意中在我的两个包中获得不同版本的
libA

repo/
├── package.json
├── packageA
│   └── package.json
│         dependencies: [
│           "libA": "^1.0.0",
│           "libB": "^1.0.0"
│         ]
├── packageB
│   └── package.json
│         dependencies: [
│           "libC": "^1.0.0"
│         ]
└── packageC
    └── package.json
          dependencies: [
            "libA": "^2.0.0" <-- different version than packageA's
          ]

有时这些不匹配是无害的。有时他们会抛出我可以立即发现的错误。但有时它们会在我的应用程序中引起细微的错误,我会浪费大量时间来追踪这些错误。因此,除了极少数情况外,我永远不想在我的 monorepo 中拥有给定包的不同版本

我想要某种护栏,以防止我安装不同的版本,除非我真的想要它们。这有最佳实践吗?我不知道会采取什么形式。以下是一些可能性:

  • 将任何共享库拉到顶层
    package.json
    。 (我在 monorepo 中有大量的包。如果只有其中几个需要
    libA
    ,如果我将
    libA
    拉到顶层,是否会对构建大小或其他什么产生负面影响?)
  • 在构建过程的某个阶段运行某种版本检查,发出不匹配警告
  • 一个纱线钩子(?),在我运行时检查版本
    yarn add
    ,并在我安装不同的版本时发出警告
  • 使用第三方工具引入另一层间接来定义跨包的通用版本
  • 还有什么我没想到的
javascript npm package.json monorepo yarn-workspaces
1个回答
0
投票

查看syncpack。它将通过确保给定 monorepo 中所有 package.json 文件的依赖关系一致来完成您想要的基本操作。

您可以通过 git hook(我们使用 husky)或通过 npm 脚本使用它。

© www.soinside.com 2019 - 2024. All rights reserved.