You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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仓库里不存在这个包。正确的生产部署流程是:

  1. 根目录执行pnpm turbo build,得到所有包的构建产物
  2. 使用pnpm的deploy命令打包生产环境所需文件:
    pnpm deploy apps/api ./api-deploy
    
    这条命令会把API的生产依赖(包括@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:50:14