对于前端架构,我正在评估 monorepo 与 Nrwl Nx 的使用。
我从文档中了解到,Nx 强烈建议对依赖项使用单一策略(根 package.json ,其中包含应用程序和库使用的所有依赖项)。
今天的目标是找出是否有某种解决方案可以出于任何原因为特定应用程序使用不同的依赖版本(也称为 monorepo 中的多个 package.json)。
我试图分析的场景如下:
root package.json 包含
[电子邮件受保护]
这意味着每个应用程序都将使用1.2.2版本。 一切都工作正常,直到有一天cursedApp需要使用[电子邮件受保护]。
有什么解决办法吗?我阅读了文档,不鼓励这种模式,我发现的唯一建议是从 monorepo 中删除cursedApp。
谢谢! D
https://nx.dev/packages/node/executors/webpack#generatepackagejson 它说:-
生成 package.json 文件,其中填充了项目的 node_module 依赖项,以便安装在容器中。 如果项目目录中存在package.json,它将被重用并填充依赖项。
npm
已经支持安装同一库的多个版本。我不确定 yarn
的语法,但我认为它是相似的。
"dependencies": {
"somelib": "npm:somelib@^1.2.2",
"somelib2": "npm:somelib@^1.1.9"
}
安装了该库的两个版本后,您可以修改特定项目的
tsconfig.json
文件,以将 somelib
导入映射到 somelib2
。
这不是一个理想的解决方案,因为
node_modules
中的子库将继续使用 somelib
。这些需要通过使用根 package.json
文件夹中的分辨率覆盖来修复。 npm
和 yarn
都支持此类覆盖。
我将上述内容称为 hack,以解决临时情况,您希望尽快将所有内容恢复为使用最新版本的
somelib
。
或者,
nx
确实支持单一仓库中的所有项目拥有自己的 package.json
文件和自己的 node_modules
。这是将现有 monorepo 转换为 nx
工作区时的默认行为。因为假设现有的单声道芯片就是这样工作的。
我不确定如何将具有根
nx
的node_modules
工作区转换为自己的项目,但我确信这是可能的。您可能会避免使用内置项目类型,而只是将所有内容构建为 NodeJs 项目。