我有一个 monorepo,里面有很多微服务。我想让任何需要它的微服务都可以使用一些库类型的函数/类。但是,如果该库包声明了对等依赖项,则在从依赖于该库的事物中运行代码时将找不到对等依赖项。
考虑这个回购结构:
- 库
- 一些库(peerDepends on
foo
)- index.js(需要
foo
) - node_modules 将为空
- index.js(需要
- 一些库(peerDepends on
- 服务
- 一些服务(取决于
foo
, 和some-library
)- index.js(需要
some-library
) - node_modules 将具有:
foo
some-library
将是一个符号链接../../lib/some-library
- index.js(需要
- 一些服务(取决于
运行时node services/some-service/index.js
,您将收到错误“找不到模块 'foo'”,来自lib/some-library/index.js
.
可能发生这种情况是因为节点只查看祖先目录中的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
我只看到两个解决方案:
- 不要在库中使用 peerDependencies
- 为了本地开发和测试,在项目的根目录安装每个对等依赖项。
这些都不是一个真正好的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)被碰撞,所有使用该库的服务然后让它们的依赖版本同时碰撞,这使它们更加脆弱,因为它们都捆绑在一起。