VSCode的launch.json不支持单个program字段配置多进程,必须通过configurations数组并列定义多个独立调试配置,每个配置对应一个服务,并用compounds组合启动。

launch.json 里不能写多个 program,必须用 configurations 数组并列定义
VSCode 的调试器一次只 attach 一个进程,program 字段不支持数组或逗号分隔。所谓“多进程同时断点”,本质是启动多个独立调试会话,每个对应一个微服务进程。
正确做法是在 launch.json 的 configurations 数组中,为每个服务写一个完整对象:
- 每个
name必须唯一(如"auth-service"、"api-service") -
type统一设为"node",request用"launch" -
port不能重复(如9221、9222),否则 Chrome DevTools 无法区分 -
outFiles要指向各自服务编译后的 JS 目录(如"${workspaceFolder}/auth/dist/**/*.js"),避免 source map 映射串扰
必须启用 autoAttachChildProcesses: true 才能命中子进程断点
微服务常依赖 child_process.fork() 或 cluster 启动工作进程,VSCode 默认不自动 attach 这些子进程——断点会灰掉、控制台无输出、调用栈空。
在每个服务的调试配置中显式加这一项:
"autoAttachChildProcesses": true
注意:该选项仅在 VSCode 1.78+ 生效;低于此版本需改用 attach 模式手动连接子进程端口。
常见坑:
- 没加这行 → 子进程日志照常打印,但断点完全无效
- 加了但断点仍不触发 → 检查
tsconfig.json中"sourceMap": true是否开启,且outDir与outFiles路径匹配 - 子进程启动慢 → 首次命中可能延迟 1–2 秒,属正常现象
多服务共用一个 launch.json?别这么做,路径变量会错乱
把所有微服务配置塞进同一个 launch.json 看似省事,但 ${workspaceFolder} 在 monorepo 中会指向根目录,而各服务的 src、dist 实际分散在子目录下,导致 program 路径错误、source map 加载失败。
推荐结构:
- 每个服务目录下单独建
.vscode/launch.json(如auth/.vscode/launch.json) -
program改用相对路径:"./dist/main.js",不依赖${workspaceFolder} - 用
env字段隔离环境变量:"PORT": "3001"、"NODE_ENV": "development" - 避免所有服务共用同一
outFiles路径,否则 TS 断点映射会互相覆盖
一键启动全部服务?靠 compounds + 多配置组合
手动逐个点击每个调试配置太低效。VSCode 支持用 compounds 把多个 configurations 组合成一个启动动作。
在 launch.json 根级加:
"compounds": [
{
"name": "all-services",
"configurations": ["auth-service", "api-service", "gateway"]
}
]
然后从调试面板选择 all-services,VSCode 会并发启动三个调试会话。
关键约束:
-
configurations数组里的名字,必须和configurations中各对象的name完全一致 - 所有被包含的配置必须使用
request: "launch",attach模式无法被 compound 自动触发 - 如果某个服务启动失败(如端口占用),其余服务仍会继续启动,不会中断整个 compound
复杂点在于:每个服务的 ts-node 启动方式、sourceMap 路径、环境变量都得单独校准,漏配一项,那个服务的断点就停不到 TS 源码上。


















