tasks.json必须严格置于工作区根目录的.vscode/tasks.json路径下,否则vscode完全不识别;type选shell支持shell语法,process需分离command与args;tsc --watch需同时设isbackground:true和problemmatcher:"$tsc-watch"才能报错跳转;ctrl+shift+b仅触发group:"build"的任务。

tasks.json 必须放在工作区根目录的 .vscode/ 下,否则任务根本不会加载——不是“不生效”,是 VSCode 压根看不见它。
tasks.json 放错位置就等于没写
VSCode 只扫描你当前打开的**工作区根目录**下的 .vscode/tasks.json。常见错误包括:
- 把文件放进 src/.vscode/tasks.json 或 myproject/.vscode/tasks.json.bak
- 用 “Open File” 打开单个 .ts 文件,而不是 “Open Folder” 打开整个项目文件夹
- 多根工作区里,只在其中一个根目录配了 tasks.json,其他根目录的任务不会自动继承
改完路径不用重启 VSCode,但得按 Ctrl+Shift+P → 输入 Tasks: Run Task 刷新缓存,否则旧任务还在列表里。
type: "shell" 还是 type: "process"?选错就卡死
type: "shell" 走系统 shell(Windows 默认 cmd.exe,macOS/Linux 是 bash),支持 &&、|、环境变量展开,适合 npm run build 或 tsc --watch 这类带逻辑的命令。type: "process" 直接调二进制,不走 shell,启动快但不支持管道,也不自动查 $PATH;比如写 "command": "tsc",Windows 上就得改成 "command": "tsc.cmd"。
Windows 用户注意:
- type: "shell" 默认用 cmd,不认识 export NODE_ENV=dev
- 想用 PowerShell,必须显式加 "options": {"shell": {"executable": "pwsh"}}
tsc --watch 为啥不报错也不跳转?
因为 VSCode 默认把它当普通前台命令执行,输出只是文本流,不是“问题”。要让它识别错误并跳转,必须同时满足两个条件:
- 加 "isBackground": true:告诉 VSCode “这任务不会退出,别等它结束”
- 加 "problemMatcher": "$tsc-watch":复用内置匹配器,解析 error TS2304 这类格式
缺一不可。缺前者,VSCode 卡在 “正在运行任务…”;缺后者,红字全在终端里,问题面板空空如也,F8 也跳不到源码。
另外:
- "$tsc-watch" 适配监听模式,"$tsc" 只匹配一次性构建
- 如果用自定义构建工具(如 esbuild),得自己写 problemMatcher 正则,且捕获组顺序必须和 file、line、column、message 严格对齐
Ctrl+Shift+B 没反应?检查这三个点
这个快捷键只触发 group: "build" 的任务,且只认当前打开文件所属的那个工作区根目录下的配置。
常见断点:
- 没设 "group": "build",或写了 "group": "builds" 这种拼写错误
- 同一 tasks 数组里有多个 group: "build",VSCode 不知道选哪个,默认弹选择菜单
- 任务用了 "isBackground": true 但没配 problemMatcher,VSCode 认为“没输出可看”,干脆不显示在构建菜单里
想一键直达:
- 确保只有一个 group: "build" 任务
- 加上 "presentation": {"reveal": "silent", "panel": "shared"},避免每次弹新终端面板
- 右键该任务 → “设置为默认构建任务”,之后 Ctrl+Shift+B 就直接跑它
真正麻烦的从来不是写 JSON,而是让命令的生命周期、输出格式、错误结构和 VSCode 的预期严丝合缝对上——尤其当你混用 pnpm、deno task、just 时,每个 runner 的 stderr 行为都不一样。











