使用对等依赖与本地(文件:../some-lib)依赖

Using Peer Dependencies With Local (file:../some-lib) Dependencies

我有一个 monorepo,里面有很多微服务。有一些库类型的函数 / 类 我想提供给任何需要它的微服务。但是,如果该库包声明了一个对等依赖项,那么当 运行从依赖该库的事物中调用代码时,将找不到对等依赖项。

考虑这个回购结构:

当 运行 宁 node services/some-service/index.js 时,您将收到错误 "Cannot find module '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    

我只看到两个解决方案:

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

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

node --preserve-symlinks index.js 

Here's a link to the docs

我有一个 dual-workspace 设置,其中:

工作区1

  • shared-library
  • module-library(同行依赖shared-library

工作空间2

  • main-app(取决于 module-libraryshared-library

现在,工作区项目的依赖项在 compilerOptions.paths 下的 tsconfig.base.json 文件中定义。

然而,对于与工作区 1 无关的工作区 2,我安装了这些软件包(均通过 file:。当我构建 main-app 时,我收到 module-library 无法找到的错误shared-library(即使它安装在 workspace2 中。

我必须将 ./../workspace1/dist/shared-library 添加到 workspace2 的 tsconfig.base.json 中的 compilerOptions.paths(注意对 workspace1 的引用)。

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