将 Peer 依赖与本地 (file:../some-lib) 依赖一起使用

Jer*_*son 7 node.js npm monorepo peer-dependencies

我有一个包含许多微服务的 monorepo。我想让任何需要它的微服务都可以使用一些库类型的函数/类。但是,如果该库包声明了对等依赖项,则在从依赖于该库的事物中运行代码时将找不到对等依赖项。

考虑这个回购结构:

    • some-library (peerDepends on foo)
      • index.js(需要foo
      • node_modules 将为空
  • 服务
    • some-service(取决于foo, 和some-library
      • index.js(需要some-library
      • node_modules 将具有:
      • foo
      • some-library 将是一个符号链接 ../../lib/some-library

运行时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    
Run Code Online (Sandbox Code Playgroud)

我只看到两种解决方案:

  • 不要在库中使用 peerDependencies
  • 为了本地开发和测试,在项目的根目录安装每个对等依赖项。

这些都不是一个真正好的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)被碰撞,所有使用该库的服务然后让它们的依赖版本同时发生碰撞,这使得它们更加脆弱,因为它们都被捆绑在一起。

fke*_*keu 5

添加标志怎么样--preserve-symlinks?例如:

node --preserve-symlinks index.js 
Run Code Online (Sandbox Code Playgroud)

这是文档的链接