使用对等依赖与本地(文件:../some-lib)依赖
Using Peer Dependencies With Local (file:../some-lib) Dependencies
我有一个 monorepo,里面有很多微服务。有一些库类型的函数 / 类 我想提供给任何需要它的微服务。但是,如果该库包声明了一个对等依赖项,那么当 运行从依赖该库的事物中调用代码时,将找不到对等依赖项。
考虑这个回购结构:
- 库
- some-library (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
时,您将收到错误 "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
我只看到两个解决方案:
- 不要在库中使用 peerDependencies
- 为了本地开发和测试,将每个对等依赖项安装在项目的根目录下。
这些都不是真正好的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)发生变化,所有使用该库的服务随后会同时提升其依赖项版本,这使得它们更加脆弱,因为它们都捆绑在一起。
添加 --preserve-symlinks
标志怎么样?
例如:
node --preserve-symlinks index.js
我有一个 dual-workspace 设置,其中:
工作区1
- shared-library
- module-library(同行依赖
shared-library
)
工作空间2
- main-app(取决于
module-library
和 shared-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 的引用)。
这显然结合了我的文件系统上的工作空间。但出于开发目的,这是完美的。
我有一个 monorepo,里面有很多微服务。有一些库类型的函数 / 类 我想提供给任何需要它的微服务。但是,如果该库包声明了一个对等依赖项,那么当 运行从依赖该库的事物中调用代码时,将找不到对等依赖项。
考虑这个回购结构:
- 库
- some-library (peerDepends on
foo
)- index.js(需要
foo
) - node_modules 将为空
- index.js(需要
- some-library (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
时,您将收到错误 "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
我只看到两个解决方案:
- 不要在库中使用 peerDependencies
- 为了本地开发和测试,将每个对等依赖项安装在项目的根目录下。
这些都不是真正好的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)发生变化,所有使用该库的服务随后会同时提升其依赖项版本,这使得它们更加脆弱,因为它们都捆绑在一起。
添加 --preserve-symlinks
标志怎么样?
例如:
node --preserve-symlinks index.js
我有一个 dual-workspace 设置,其中:
工作区1
- shared-library
- module-library(同行依赖
shared-library
)
工作空间2
- main-app(取决于
module-library
和shared-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 的引用)。
这显然结合了我的文件系统上的工作空间。但出于开发目的,这是完美的。