AwesomeProject/
├─ workspaceA/
│ ├─ packageA.json
├─ workspaceB/
│ ├─ packageB.json
├─ workspaceC/
│ ├─ packageC.json
packageRoot.json
我们可以将依赖项安装到带有
npm install --save --workspace=workspaceA
的工作区中。假设我们在两个或多个工作空间中使用了一些依赖性,即。在某个时候,依赖项仅更新到其中一个工作区中。这在多年来的开发过程中多次发生,很快我们将陷入一个工作区不再使用相同版本的依赖项的情况。随着时间的流逝,这可能成为一个大问题,开始更新和同步包装确实很麻烦。
在某些项目中,我在root软件包中使用了覆盖物。
axios
// packageA.json and packageB.json
{
...
dependencies: {
...
axios: "*",
...
}
}
在某种程度上工作正常。我知道这是一种风险,因为覆盖也是其他依赖性的亚依赖性,如果它们恰好被列为其依赖性为依赖性。项目越小,这种冲突发生的可能性就越小。
相反,无论项目增长越大,您越有可能遇到这种覆盖方法的问题。
SO,是否有一种方法可以定义MonorePo中的依赖项,以便所有工作区都使用它们都使用的依赖项的相同版本而无需定义这些覆盖范围?如果您更新依赖项X,则在所有工作区中都会更新,但与此同时,第三方依赖关系不断使用其定义的依赖项,除非在覆盖中明确覆盖。 根据使用哪个软件包管理器,可能有不同的方法来执行此操作,因此欢迎每个软件包管理器的解决方案。而且,如果有一个解决方案可以更好地适合所有包装管理人员!
packageRoot.json
{
...
overrides: {
axios: "1.2.3",
...
}
}
的pnpm
pnpm.overrides
pnpmfile.js
# pnpm.overrides
dependencies:
axios: "1.2.3" # Overrides only direct dependencies
是一个JavaScript文件,允许您在安装过程中对依赖关系进行编程修改。这是非常强大的,但也更复杂。
YARN 2+(Berry)还具有强大的约束系统,可用于执行依赖性版本。您在.yarn/constraints.pro中定义了包装管理器必须遵守的规则。这提供了非常严格的执法。
pnpmfile.js
该约束将确保# .yarn/constraints.pro
"axios@*": version == "1.2.3"
中的所有用途均为版本1.2.3。如果依赖关系请求相互冲突的版本,则纱线会出错。