我有一个 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
,并在我安装不同的版本时发出警告