tasks.json必须严格置于项目根目录的.vscode/tasks.json路径下,文件名全小写、无空格或额外后缀,且仅在“文件夹工作区”中生效;否则tasks菜单为空、快捷键无效。

tasks.json 必须放在项目根目录的 .vscode/tasks.json 路径下,否则 VSCode 完全不识别——这不是“可能失效”,而是菜单里直接为空。
tasks.json 放哪儿、叫啥名,VSCode 才认
VSCode 只读取且仅读取工作区根目录下的这一个文件:.vscode/tasks.json。路径或文件名错一丁点,任务就彻底消失:
-
.vscode/tasks.json✅(唯一有效位置) -
task.json❌(少个s) -
.vscode/tasks/tasks.json❌(多了一层目录) -
src/.vscode/tasks.json❌(子文件夹里无效) -
~/tasks.json❌(用户家目录不生效)
另外,如果你是用「File → Open File」打开单个文件,而不是「File → Open Folder」打开整个项目文件夹,.vscode/ 下所有配置(包括 tasks.json)都不加载,Tasks 菜单直接为空。
为什么 Tasks: Run Task 里找不到你的 label
不是 VSCode 没刷新,而是配置没被识别为“可运行任务”。高频原因有这几个:
-
label含空格或中文:比如"label": "npm build",某些版本会解析失败;建议用短横线:"label": "npm-build" - 漏了
"group": "build"或"isBuildCommand": true:Ctrl+Shift+B 只显示带group: "build"的任务 -
version写成"2.0"或2.0.0(没加引号):必须是字符串"2.0.0" - 多根工作区下,你改的是非活动文件夹里的
tasks.json:只有当前焦点文件夹的配置生效
tsc --watch 为啥不报错也不跳转到错误行
因为 VSCode 默认把 tsc --watch 当作普通前台命令执行——输出红字只是文本流,不解析、不定位。要让它真正“活”起来,必须同时满足三个条件:
- 显式写
"isBackground": true,否则 VSCode 认为任务已结束,后续输出不再捕获 - 用
"problemMatcher": "$tsc-watch"(不是$tsc),这是 TypeScript 官方为监听模式设计的匹配器 - 首次需手动运行一次任务:
--watch模式不会自动触发,保存后也不会构建,原生不支持runOnSave
示例关键字段:
{
"label": "tsc-watch",
"type": "shell",
"command": "tsc",
"args": ["--watch"],
"isBackground": true,
"problemMatcher": "$tsc-watch"
}
npm run build 报 command not found 怎么办
VSCode 的任务进程默认不加载 shell 配置(如 ~/.zshrc),也不自动使用项目级 Node.js 版本(比如 nvm 或 volta 管理的)。直接写 "command": "npm" 很可能找不到命令,或调用到系统全局旧版 Node。
- 推荐用
npx --no-install:例如"command": "npx","args": ["--no-install", "tsc", "--build"] - 或指向本地二进制:
"command": "./node_modules/.bin/tsc",避免依赖全局安装 - 需要
.env变量时,必须手动补全"env"字段,例如"env": { "NODE_ENV": "development" } - Windows 用户若用 PowerShell 脚本,记得加
"shell": { "executable": "pwsh", "args": ["-Command"] },否则脚本被策略拦截
tasks.json 不是“配完就自动跑”的开关,它只在你手动触发时才执行命令;所谓自动化,全靠 problemMatcher + isBackground + dependsOn 这三者的组合逻辑来实现——其中最容易被忽略的是 isBackground 和对应匹配器的严格配对,漏掉任一,任务就只是“看起来在跑”,实则错误不可见、无法跳转。











