我有一个monorepo,里面有许多微服务。我想让一些库类型的函数/类可用于任何需要它的微服务。但是,如果该库包声明了对等依赖项,则在依赖于库的事物中运行代码时,找不到对等依赖项。
考虑这个回购结构:
foo
上的peerDepends)
foo
)foo
和some-library
)
some-library
)foo
some-library
将成为../../lib/some-library
运行node services/some-service/index.js
时,您会收到来自lib/some-library/index.js
的错误“找不到模块'foo'”。
可能这是因为节点只查看祖先目录中的lib/some-library/node_modules
和任何node_modules
文件夹。但是,由于此代码是从services/some-service
(作为工作目录)运行的,并且由于services/some-service/node_modules
中的符号链接,我希望这可以工作。
以下是您可以轻松克隆以查看问题的回购:https://github.com/jthomerson/example-local-dependency-problem
git clone git@github.com:jthomerson/example-local-dependency-problem.git
cd example-local-dependency-problem
cd services/some-service
npm install
node index.js
我只看到两个解决方案:
这些都不是一个真正伟大的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)受到冲击,那么所有服务都是使用该库然后同时使它们的依赖版本碰撞,这使得它们更加脆弱,因为它们都被捆绑在一起。
答案 0 :(得分:1)
答案 1 :(得分:0)
我有一个双工作区设置,其中:
shared-library
)module-library
和shared-library
)现在,工作空间项目的依赖性在tsconfig.base.json
下的compilerOptions.paths
文件中定义。
但是,对于与工作空间1无关的工作空间2,我安装了软件包(均通过file:
。然后,我构建main-app
时收到了错误消息,module-library
无法找到{{ 1}}(即使它已安装在工作区2中。
我必须将shared-library
添加到工作区2的./../workspace1/dist/shared-library
中的compilerOptions.paths
(注意对工作区1的引用)。
这显然会耦合文件系统上的工作空间。但是出于开发目的,这是完美的。