tasks.json必须放在工作区根目录的.vscode/tasks.json路径下,文件名全小写、编码utf-8无bom;多根工作区需各文件夹单独配置;command与args须正确拆分,problemmatcher为必填项,ctrl+shift+b仅识别group:"build"且isdefault:true的任务。

VSCode 里配自定义构建脚本,不是写完 tasks.json 就能跑通的——真正卡住人的,是环境、路径、执行上下文这三样没对齐。
tasks.json 放错位置就等于没配
VSCode 只读工作区根目录下的 .vscode/tasks.json。这个“根目录”必须是你用 File → Open Folder 打开的那个文件夹,且 .vscode 必须是它的直接子目录。
- 把
tasks.json放进src/或scripts/?任务不会出现 - 多根工作区(workspace)下,每个文件夹都要单独配自己的
.vscode/tasks.json,父级不继承 - 文件名写成
task.json、tasks.json.bak或大小写错误(如.VSCode),VSCode 直接忽略 - 编码必须是 UTF-8 无 BOM,否则报
Invalid character in identifier
command 和 args 写法错误导致命令找不到
常见现象:command not found: npm、spawn tsc ENOENT。本质是 VSCode 启动时没加载你的 shell 初始化文件(比如 ~/.zshrc),PATH 不包含本地工具路径。
- 用
"type": "shell"时,command是程序名(如"npm"),所有参数必须拆进args数组:"command": "npm", "args": ["run", "build"]✅"command": "npm run build"❌(会当成一个命令名去搜) - 调本地二进制(如
tsc)优先用npx tsc或./node_modules/.bin/tsc,避免依赖全局安装 - 路径含空格不用加引号:
"args": ["src/main.ts"]比"args": ["\"src/main.ts\""]更安全 - 需要管道或变量展开(如
npm run lint && npm run build),必须用"type": "shell",且把整条命令放command字段
problemMatcher 不配,错误就“看不见”
没配 problemMatcher,终端里明明报了错,Problems 面板却空空如也,也没法点击跳转到源码行——这不是 bug,是设计如此。
-
problemMatcher是必选项,不是可选增强项 - TypeScript 项目直接用
"problemMatcher": ["$tsc"];带 watch 的用["$tsc-watch"],但必须加"isBackground": true - 自定义命令需手写正则,pattern 至少捕获
file、line、column、message四个命名组,顺序不能错 - 多个 matcher 可写成数组,例如
["$tsc", "$eslint-stylish"],匹配不同工具输出
Ctrl+Shift+B 不触发?检查 group 和 isDefault
VSCode 不会自动猜你用什么构建,Ctrl+Shift+B 默认只找 group: "build" 且 isDefault: true 的那个任务。
- 必须显式写
"group": "build",写成"group": { "kind": "build" }是旧版写法,新版已不兼容 - 多个 build 任务时,只标记一个
"isDefault": true;否则快捷键会弹出列表让你选 - 想按文件类型切换构建(如
.go跑go build,.ts跑tsc),VS Code 原生不支持自动识别后缀选 task,得手动配多个 task 并用快捷键分别绑定 -
"presentation"推荐设为{"reveal": "silent", "panel": "shared", "clear": true},避免每次构建都新开终端面板
最常被忽略的一点:VSCode 启动时加载的是非交互式 shell,它不 source 你的 ~/.zshrc 或 ~/.bash_profile。macOS/Linux 用户要么启用 terminal.integrated.inheritEnv,要么在 tasks.json 里显式指定 shell 路径和初始化逻辑——这点不处理,再标准的配置也会在终端里能跑、任务里失败。











