Yarn Workspaces monorepo集成Nest.js模块的兼容性问题咨询
解决Yarn Workspaces与Nest.js Monorepo配置冲突方案
二者不存在本质冲突,仅需调整Nest CLI的配置路径即可兼容,完整配置步骤如下:
1. 根目录package.json配置
根目录的package.json是二者都需要的,不存在冲突,直接在其中配置Yarn Workspaces规则即可:
{ "name": "monorepo-root", "private": true, "workspaces": [ "packages/*" ], "devDependencies": { "@nestjs/cli": "^10.0.0", "typescript": "^5.0.0" // 其他全局公共依赖 } }
该配置会让Yarn自动识别packages/下的所有子模块,同时满足Nest对根目录存在package.json的要求。
2. 新增根目录nest-cli.json配置
将Nest的Monorepo规则指向packages/下的对应模块,示例配置如下:
{ "$schema": "https://json.schemastore.org/nest-cli", "collection": "@nestjs/schematics", "monorepo": true, "compilerOptions": { "deleteOutDir": true, "webpack": true }, "projects": { "entrypoint": { "type": "application", "root": "packages/entrypoint", "entryFile": "main", "sourceRoot": "packages/entrypoint", "compilerOptions": { "tsConfigPath": "packages/entrypoint/tsconfig.json" } }, "nestjs-module-1": { "type": "library", "root": "packages/nestjs-module-1", "entryFile": "index", "sourceRoot": "packages/nestjs-module-1", "compilerOptions": { "tsConfigPath": "packages/nestjs-module-1/tsconfig.json" } }, "nestjs-module-2": { "type": "library", "root": "packages/nestjs-module-2", "entryFile": "index", "sourceRoot": "packages/nestjs-module-2", "compilerOptions": { "tsConfigPath": "packages/nestjs-module-2/tsconfig.json" } } } }
非Nest.js的普通业务模块不需要在该配置中注册。
3. 统一TS配置解决跨模块引用问题
在根目录新增公共tsconfig.json,配置路径别名简化跨模块引用:
{ "compilerOptions": { "module": "commonjs", "declaration": true, "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES2021", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", "paths": { "@your-project/entrypoint": ["packages/entrypoint/main.ts"], "@your-project/nestjs-module-1": ["packages/nestjs-module-1/index.ts"], "@your-project/nestjs-module-2": ["packages/nestjs-module-2/index.ts"], "@your-project/common": ["packages/not-a-nestjs-module/index.ts"] }, "incremental": true, "skipLibCheck": true } }
各个子包的tsconfig.json直接继承根配置即可,例如packages/entrypoint/tsconfig.json:
{ "extends": "../../tsconfig.json", "include": ["**/*"], "compilerOptions": { "outDir": "./dist" } }
4. 子包配置要点
每个packages/下的子模块都需要有独立的package.json,name字段和路径别名保持一致即可,例如packages/nestjs-module-1/package.json:
{ "name": "@your-project/nestjs-module-1", "version": "1.0.0", "main": "index.ts", "private": true, "dependencies": { // 模块自有依赖 } }
Yarn安装依赖时会自动将所有子包软链接到根node_modules中,Nest运行时可直接识别引用。
5. 运行验证
- 本地启动入口服务:
nest start entrypoint --watch - 打包Lambda版本:修改
entrypoint项目配置的entryFile为lambda后执行nest build entrypoint - 打包本地运行版本:修改
entrypoint项目配置的entryFile为local后执行nest build entrypoint
如果你使用Yarn 2/3/4等Berry版本,建议在根目录
.yarnrc.yml中配置nodeLinker: node-modules,避免Nest编译器依赖解析异常。
内容的提问来源于stack exchange,提问作者Marcelo Luiz Onhate
相关产品推荐
相关产品推荐

