使用Peer Dependencies with Local(文件:../ some-lib)依赖关系

时间:2018-06-11 23:23:34

标签: node.js npm monorepo peer-dependencies

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

考虑这个回购结构:

  • LIB
    • some-library(foo上的peerDepends)
      • index.js(需要foo
      • node_modules将为空
  • 服务
    • some-service(取决于foosome-library
      • index.js(需要some-library
      • node_modules将具有:
      • 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    

我只看到两个解决方案:

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

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

2 个答案:

答案 0 :(得分:1)

添加--preserve-symlinks标志怎么样? E.g:

node --preserve-symlinks index.js 

Here's a link to the docs

答案 1 :(得分:0)

我有一个双工作区设置,其中:

workspace1

  • 共享库
  • 模块库(对等取决于shared-library

workspace2

  • 主应用程序(取决于module-libraryshared-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的引用)。

这显然会耦合文件系统上的工作空间。但是出于开发目的,这是完美的。

相关问题