Nx+NestJS+TypeORM数据库迁移配置报错求助
问题:Nx 单体仓库中 NestJS+TypeORM 迁移配置 TS6059 错误
在Nx单体仓库的NestJS+TypeORM应用中配置数据库迁移时,运行build-migration-config触发TS6059错误——因Post实体存放于Nx lib目录,不在rootDir指定的apps/api路径下,导致编译失败。求可行解决方案,包括其他迁移实现思路。
当前Nx目标配置
"build-migration-config": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/apps/typeorm-migration", "main": "apps/api/src/typeorm.config.ts", "tsConfig": "apps/api/tsconfig.app.json" } }, "typeorm-generate-migrations": { "executor": "nx:run-commands", "outputs": ["{options.outputPath}"], "options": { "cwd": "apps/api/src/migrations", "commands": [ "npx typeorm -d ../../../../dist/apps/typeorm-migration/src/app/typeorm.config.js migration:generate" ], "outputPath": "dist/apps/typeorm-migration" }, "dependsOn": ["build-migration-config"] }, "typeorm-run-migrations": { "executor": "nx:run-commands", "outputs": ["{options.outputPath}"], "options": { "cwd": "apps/api/src/migrations", "commands": [ "npx typeorm -d ../../../../dist/apps/typeorm-migration/src/app/typeorm.config.js migration:run" ] }, "dependsOn": ["build-migration-config"] }
错误信息
> nx run api:build-migration-config Compiling TypeScript files for project "api"... apps/api/src/app/app.module.ts:6:40 - error TS6059: File '/Users/user/demos/nx-typeorm-migration-demo/libs/shared/util/models/src/index.ts' is not under 'rootDir' '/Users/user/demos/nx-typeorm-migration-demo/apps/api'. 'rootDir' is expected to contain all source files. 6 import { SharedUtilModelsModule } from '@typeorm-migrations/shared/util/models'; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libs/shared/util/models/src/index.ts:1:15 - error TS6059: File '/Users/user/demos/nx-typeorm-migration-demo/libs/shared/util/models/src/lib/shared-util-models.module.ts' is not under 'rootDir' '/Users/user/demos/nx-typeorm-migration-demo/apps/api'. 'rootDir' is expected to contain all source files. 1 export * from './lib/shared-util-models.module'; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libs/shared/util/models/src/lib/shared-util-models.module.ts:3:22 - error TS6059: File '/Users/user/demos/nx-typeorm-migration-demo/libs/shared/util/models/src/lib/post.entity.ts' is not under 'rootDir' '/Users/user/demos/nx-typeorm-migration-demo/apps/api'. 'rootDir' is expected to contain all source files. The file is in the program because: Imported via './post.entity' from file '/Users/user/demos/nx-typeorm-migration-demo/libs/shared/util/models/src/lib/shared-util-models.module.ts' Imported via './lib/post.entity' from file '/Users/user/demos/nx-typeorm-migration-demo/libs/shared/util/models/src/index.ts' Root file specified for compilation 3 import { Post } from './post.entity'; ~~~~~~~~~~~~~~~ libs/shared/util/models/src/index.ts:2:15 2 export * from './lib/post.entity'; ~~~~~~~~~~~~~~~~~~~ File is included via import here.
解决方案
方案1:调整TS配置,包含Nx Lib文件
当前tsconfig.app.json的rootDir仅指向apps/api,无法识别lib目录下的实体文件。可以新建一个专门用于迁移的TS配置文件:
- 在
apps/api下创建tsconfig.migration.json:
{ "extends": "./tsconfig.json", "compilerOptions": { "rootDir": "../../", "outDir": "../../dist/apps/typeorm-migration", "module": "commonjs", "target": "ES2020", "esModuleInterop": true }, "include": [ "src/**/*", "../../libs/shared/util/models/src/**/*" ] }
- 修改
build-migration-config的tsConfig指向新文件:
"build-migration-config": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/apps/typeorm-migration", "main": "apps/api/src/typeorm.config.ts", "tsConfig": "apps/api/tsconfig.migration.json" } }
方案2:用ts-node直接运行迁移,跳过单独编译
无需单独编译typeorm.config.ts,直接用ts-node加载TS配置并处理路径映射:
- 安装依赖:
npm install ts-node tsconfig-paths --save-dev
- 修改Nx迁移目标,移除对
build-migration-config的依赖:
"typeorm-generate-migrations": { "executor": "nx:run-commands", "options": { "cwd": "apps/api", "commands": [ "npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/typeorm.config.ts migration:generate src/migrations/$NAME" ] } }, "typeorm-run-migrations": { "executor": "nx:run-commands", "options": { "cwd": "apps/api", "commands": [ "npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/typeorm.config.ts migration:run" ] } }
运行时可通过nx run api:typeorm-generate-migrations --args="--name=InitPosts"指定迁移名称。
方案3:将迁移配置封装为单独Nx Lib
把typeorm.config.ts和实体依赖打包成独立的Nx Lib,确保编译时包含所有必要文件:
- 新建Lib:
nx generate @nx/js:lib typeorm-config --buildable
将
apps/api/src/typeorm.config.ts移至libs/typeorm-config/src/lib/,并调整实体导入路径,确保能正确引用shared/util/models中的实体。配置
libs/typeorm-config/tsconfig.lib.json,确保include包含依赖的lib:
"include": [ "src/**/*", "../shared/util/models/src/**/*" ]
- 修改Nx迁移目标,编译该Lib后使用其产物:
"build-migration-config": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/libs/typeorm-config", "main": "libs/typeorm-config/src/lib/typeorm.config.ts", "tsConfig": "libs/typeorm-config/tsconfig.lib.json" } }, "typeorm-generate-migrations": { "executor": "nx:run-commands", "options": { "cwd": "apps/api/src/migrations", "commands": [ "npx typeorm -d ../../../../dist/libs/typeorm-config/src/lib/typeorm.config.js migration:generate" ] }, "dependsOn": ["build-migration-config"] }
内容的提问来源于stack exchange,提问作者pjlamb12
相关产品推荐
相关产品推荐

