NestJS工作区构建后无法找到编译源文件问题求助
问题描述
我将NestJS项目目录重命名为server,并把docker-compose.yml、tsconfig.json和根目录的package.json移到了该文件夹外部。根目录的package.json中配置了工作区,用于访问不同命名空间。
执行npm run start启动Docker后,根目录(server文件夹外)生成了dist文件夹,结构如下:
但server内的项目无法运行,抛出错误:
Error: Cannot find module '/opt/dist/main'
Docker启动命令:
npm run start
根目录package.json内容
{ "name": "auction", … "workspaces": [ "auction-client", "auction-server", "shared" ], "scripts": { … "docker:compose": "docker compose up", "server:dev": "wait-on tcp:6379 && npm run start:dev --workspace=auction-server", "start": "concurrently 'npm:docker:compose' 'npm:server:dev'", … }, "devDependencies": { "concurrently": "^8.2.2", "prettier": "^2.8.8", "wait-on": "^6.0.1" }, "dependencies": { "source-map-support": "^0.5.21" } }
docker-compose.yml内容
services: app: container_name: ${APP_CONTAINER_NAME}-app build: context: ./docker dockerfile: ./Dockerfile image: auction-project:alpine-10.0.5 #restart: always env_file: - ./.env networks: - default ports: - '80:3000' volumes: - .:/opt - ./docker/storage:/home/storage:rw working_dir: /opt command: npm run start:dev depends_on: - database database: … phpmyadmin: ... redis: … networks: …
docker文件夹内Dockerfile内容
FROM node:19.9.0-alpine RUN corepack disable yarn RUN npm i -g yarn RUN npm i -g @nestjs/cli@10.0.5 WORKDIR /opt
根目录tsconfig.json内容(与docker-compose.yml同级)
{ "compilerOptions": { "module": "commonjs", "declaration": true, "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES2023", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": false, "noImplicitAny": false, "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false } }
server文件夹内package.json内容
{ "name": "auction-server", "version": "0.0.1", "description": "<p></p>", "author": "", "private": true, "license": "COMMERCIAL", ... "main": ".eslintrc.js", "directories": { }, "keywords": [] }
server文件夹内tsconfig.json内容
{ "compilerOptions": { "types": ["node"], "module": "commonjs", "declaration": true, "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES2023", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": false, "noImplicitAny": false, "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false, } }
解决方案
1. 修正server目录package.json的main字段
当前server目录的package.json中main字段错误指向.eslintrc.js,需改为编译后的入口文件路径:
{ // ...其他配置项 "main": "dist/main.js", // ...其他配置项 }
2. 调整server目录tsconfig.json的输出路径
server目录的tsconfig目前将产物输出到自身./dist,与根目录tsconfig的输出路径冲突。修改为输出到根目录dist下的对应子目录,符合npm工作区结构:
{ "compilerOptions": { // ...其他编译配置 "outDir": "../dist/auction-server", // ...其他编译配置 } }
3. 修正根目录工作区配置与启动脚本
根目录package.json的工作区配置仍指向旧目录名auction-server,需改为实际目录名server,同时更新启动脚本:
{ "workspaces": [ "auction-client", "server", // 替换为实际目录名 "shared" ], "scripts": { // ...其他脚本 "server:dev": "wait-on tcp:6379 && npm run start:dev --workspace=server", // ...其他脚本 } }
4. 明确Docker容器内的启动命令
修改docker-compose.yml的command字段,直接指定工作区启动命令,避免路径混淆:
services: app: # ...其他配置 command: npm run start:dev --workspace=server # ...其他配置
5. 清理旧编译产物
删除根目录和server目录下的dist文件夹,避免缓存干扰,重新执行启动命令。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

