8

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

考虑这个回购结构:

    • 一些库(peerDepends on foo
      • index.js(需要foo
      • node_modules 将为空
  • 服务
    • 一些服务(取决于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    

我只看到两个解决方案:

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

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

4

2 回答 2

5

加个--preserve-symlinksflag怎么样?例如:

node --preserve-symlinks index.js 

这是文档的链接

于 2018-06-12T01:58:33.500 回答
0

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

工作区1

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

工作区2

  • 主应用程序(取决于module-libraryshared-library

现在,工作空间项目的依赖项tsconfig.base.jsoncompilerOptions.paths.

但是对于与workspace1无关的workspace2,我安装了包(都通过file:.当我构建时main-app,我得到了module-library无法找到的错误shared-library(即使它安装在workspace2.

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

这显然将我的文件系统上的工作区耦合在一起。但出于开发目的,这是完美的。

于 2020-10-04T22:12:37.467 回答