pnpm Turborepo中Express API构建问题求助(含本地工作区依赖)
解决方案
1. 配置Turborepo构建流水线(核心)
别直接用tsc单独构建,Turborepo本身就能自动处理工作区包的依赖构建顺序,这才是正确的打开方式。
在根目录的turbo.json中添加构建规则:
{ "$schema": "https://turbo.build/schema.json", "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] } } }
^build:强制先构建当前包依赖的所有工作区包(也就是@my/shared)outputs:指定构建产物目录,让Turbo可以缓存构建结果,提升后续构建速度
然后在根目录执行命令:
pnpm turbo build
这条命令会自动先完成packages/shared的构建,再构建apps/api,保证API构建时能拿到最新的shared包产物。
2. 修正@my/shared的package.json配置
确保shared包的构建产物能被Node和TypeScript正确识别,在packages/shared/package.json中补充以下字段:
{ "name": "@my/shared", "version": "1.0.0", "main": "./dist/index.js", // 指向构建后的JS入口文件 "types": "./dist/index.d.ts", // 指向TypeScript类型声明文件 "scripts": { "build": "tsc" // 确保shared包有独立的build脚本 } }
你的shared包tsconfig已经设置了outDir: "./dist",这部分无需修改。
3. 解决两种构建方式的报错
针对问题1:根目录执行tsc后找不到express
直接在根目录跑tsc会遍历所有包,但不会处理npm依赖的链接与安装逻辑,且多包的tsconfig可能存在冲突。改用上面的pnpm turbo build即可解决,每个包的构建会独立执行,依赖关系也会被正确处理。
针对问题2:api的dist目录执行pnpm install找不到@my/shared
绝对不要在dist目录里执行pnpm install,因为@my/shared是工作区本地包,公共npm仓库里不存在这个包。正确的生产部署流程是:
- 根目录执行
pnpm turbo build,得到所有包的构建产物 - 使用pnpm的deploy命令打包生产环境所需文件:
这条命令会把API的生产依赖(包括pnpm deploy apps/api ./api-deploy@my/shared的构建产物)打包到./api-deploy目录,直接用pm2运行该目录下的代码即可。
4. 验证导入语句
确保API中导入@my/shared的语句是标准写法,无需额外配置别名(当前tsconfig的~/*别名不影响本地包解析):
import { yourSharedUtil } from '@my/shared';
pnpm已经在工作区内部完成了本地包的链接,TypeScript会自动识别这个包。
5. 生产环境运行
用pm2启动API:
# 直接运行构建后的dist目录 pm2 start apps/api/dist/index.js --name "my-api" # 或者运行pnpm deploy后的目录 pm2 start api-deploy/index.js --name "my-api"
内容的提问来源于stack exchange,提问作者kinris
相关产品推荐
相关产品推荐

