【问题标题】:pnpm provides different hashes for the exact same version of the same dependency, breaking nestjspnpm 为相同依赖的完全相同版本提供不同的哈希,打破了nestjs
【发布时间】:2022-08-24 09:02:30
【问题描述】:
我有一个带有非常基本设置的 monorepo 可用于重现此问题 here:
它是一个单一的nestjs 应用程序,它有2 个从中读取的包。
包和主应用程序都需要@nestjs/core 以及其他依赖项才能工作,并且不仅在它们自己的本地 package.json 上而且在resolutions {} 配置上都强制使用完全相同的固定版本在主 package.json 中。
我可以检查锁定文件并发现虽然使用了相同的版本——哈希值不同,导致nestjs出现重大问题,无法可靠地导入可注入依赖项,导致它在引导时中断。
有没有办法防止这种情况?强制链接完全相同的哈希/依赖关系?
标签:
node.js
pnpm
turborepo
pnpm-workspace
【解决方案1】:
当依赖项具有对等依赖项时,如果对等依赖项在依赖关系图的各个部分中以不同方式解析,它可能会被多次写入 node_modules。
在您的情况下,@nestjs/core 位于 graphql-server 项目和 @myapp/entities 项目的依赖项中。 @nestjs/core 具有 @nestjs/platform-express 作为可选的对等依赖项。
@nestjs/platform-express 位于 graphql-server 项目的依赖项中,因此 pnpm 将其链接到 @nestjs/platform-express。您可以在锁定文件中看到它:
/@nestjs/core/8.4.7_fkqgj3xrohk2pflugljc4sz7ea:
resolution: {integrity: sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==}
requiresBuild: true
peerDependencies:
'@nestjs/common': ^8.0.0
'@nestjs/microservices': ^8.0.0
'@nestjs/platform-express': ^8.0.0
'@nestjs/websockets': ^8.0.0
reflect-metadata: ^0.1.12
rxjs: ^7.1.0
peerDependenciesMeta:
'@nestjs/microservices':
optional: true
'@nestjs/platform-express':
optional: true
'@nestjs/websockets':
optional: true
dependencies:
'@nestjs/common': 8.4.7_47vcjb2de6lyibr6g4enoa5lyu
'@nestjs/platform-express': 8.4.7_7tsmhnugyerf5okgqzer2mfqme # <------HERE
'@nuxtjs/opencollective': 0.3.2
fast-safe-stringify: 2.1.1
iterare: 1.2.1
object-hash: 3.0.0
path-to-regexp: 3.2.0
reflect-metadata: 0.1.13
rxjs: 7.5.5
tslib: 2.4.0
uuid: 8.3.2
transitivePeerDependencies:
- encoding
在另一个项目(@myapp/entities)中,@nestjs/platform-express不在依赖中,所以在安装@nestjs/core时,pnpm无法解析可选的peer依赖。结果,pnpm 需要创建另一个@nestjs/core 实例,它没有链接这个可选的对等点。正如您在锁定文件中看到的,另一个条目没有@nestjs/platform-express:
/@nestjs/core/8.4.7_g7av3gvncewo44y4rurz3mgav4:
resolution: {integrity: sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==}
requiresBuild: true
peerDependencies:
'@nestjs/common': ^8.0.0
'@nestjs/microservices': ^8.0.0
'@nestjs/platform-express': ^8.0.0
'@nestjs/websockets': ^8.0.0
reflect-metadata: ^0.1.12
rxjs: ^7.1.0
peerDependenciesMeta:
'@nestjs/microservices':
optional: true
'@nestjs/platform-express':
optional: true
'@nestjs/websockets':
optional: true
dependencies:
'@nestjs/common': 8.4.7_47vcjb2de6lyibr6g4enoa5lyu
'@nuxtjs/opencollective': 0.3.2
fast-safe-stringify: 2.1.1
iterare: 1.2.1
object-hash: 3.0.0
path-to-regexp: 3.2.0
reflect-metadata: 0.1.13
rxjs: 7.5.5
tslib: 2.4.0
uuid: 8.3.2
transitivePeerDependencies:
- encoding
为了解决这个问题,您可以将@nestjs/platform-express 添加到@myapp/entities 项目的依赖项中。它应该与其他项目中的版本相同。