VSCode任务系统仅调度命令而非执行,dependsOn默认只控制启动顺序而非等待完成;需显式配置"dependsOrder":"sequence"实现串行,长期任务须设"isBackground":true并配problemMatcher,错误捕获依赖脚本退出码与正确匹配器。

VSCode 的任务系统不是“运行器”,它本身不执行任务,只调度和封装命令——真正干活的是你的 shell、Node.js 或 Docker。想靠 tasks.json 实现可靠流水线,关键在理解它怎么启动、等不等、出错认不认。
dependsOn 默认只启动,不等待完成
这是最常踩的坑:写了 "dependsOn": ["build"],结果 deploy 任务在 tsc --watch 还没生成任何文件时就开跑,直接报错找不到 dist/。
-
dependsOn仅控制“启动顺序”,不是“完成依赖” - 若依赖项是长期运行命令(如
webpack serve、npm run dev),必须加"isBackground": true,否则 VSCode 会卡住等它退出(它根本不会退) - 要真正串行,必须显式写
"dependsOrder": "sequence";不写就默认并行 - 串行链中某个任务失败,后续任务仍会启动——VSCode 不做失败中断,靠脚本自身返回非零退出码 +
problemMatcher捕获错误
problemMatcher 决定错误能不能进“问题”面板
没有配 problemMatcher,再红的报错也只在终端里一闪而过,不会出现在底部“问题”面板,没法点跳转、没法被统一过滤。
- 用现成匹配器最省事:
["$tsc"]对应 TypeScript 编译,["$eslint-stylish"]或["$eslint-compact"]对应 ESLint 输出 - 自定义匹配器必须写正则,且注意:VSCode 匹配的是**标准输出(stdout)**,不是 stderr;很多工具默认把错误打到 stderr,得用 shell 重定向,比如
"command": "npm run build 2>&1" - 匹配器字段名必须严格对应:比如
"file"、"line"、"column"、"severity"、"message",少一个或拼错就失效
presentation.reveal 控制终端要不要弹出来
每次跑 test 或 lint 都弹终端盖住代码,体验极差;但完全隐藏又看不到实时输出,调试时抓瞎。
-
"reveal": "always":强制弹出并聚焦终端(适合构建、部署等关键任务) -
"reveal": "silent":不弹窗,只在后台运行(适合监听类任务,配合isBackground: true) -
"reveal": "never":连输出都不显示——除非你真不需要看任何日志,否则别选 -
"echo": true会把命令本身打印出来,方便确认到底执行了哪条命令,建议始终开启
group 和快捷键绑定决定你按几次 Ctrl+Shift+B
group 不只是分类标签,它直接绑定 VSCode 的内置快捷键逻辑:
-
"group": "build"→ 可用Ctrl+Shift+B(Windows/Linux)或Cmd+Shift+B(macOS)快速触发 -
"group": "test"→ 默认没快捷键,但可在命令面板搜 “Tasks: Run Test Task” 触发 - 多个任务同属一个
group,Ctrl+Shift+B会弹出菜单让你选;想一键直达,就得让该 group 下只有一项任务 - 别把 lint、test、build 全塞进
"group": "build"——语义混乱,快捷键失效,团队协作时容易误操作
真实流水线里,串行和并行得拆着设计:编译→打包→部署必须锁死 dependsOrder: sequence,而 lint、test、type-check 这类检查项更适合并行启动,但它们不该混进主链——否则一次失败就卡死整个交付流程。最稳的做法,是让主链只干确定性动作,检查类任务单独定义、手动触发或靠扩展联动。


















