vscode本身不提供部署功能,所有部署均由tasks.json定义的命令触发;npm run deploy报“command not found”主因是vscode未加载shell配置导致path缺失,应优先用npx --no-install调本地包、显式指定shell路径、开启inheritenv并从终端启动code .。

VSCode 本身不提供“部署”功能,所有部署行为都必须由你定义的命令触发;真正起作用的是 tasks.json 如何调用 shell、npm 或自定义脚本,并控制它们的执行顺序、环境和输出解析。
为什么 npm run deploy 在任务里总报 “command not found”
这不是 npm 坏了,而是 VSCode 启动时没加载你的 shell 配置文件(比如 ~/.zshrc),PATH 里压根没有本地安装的 CLI 工具路径。
- 临时解法:在
tasks.json的"env"字段里手动补全 PATH,例如"PATH": "/opt/homebrew/bin:/usr/local/bin:${env:PATH}" - 根治法:在 VSCode 设置中开启
terminal.integrated.inheritEnv(设为true),并确保你是从终端执行code .启动的,而不是点桌面图标 - 更稳妥的做法:别依赖全局
npm install -g,改用npx,比如把命令写成"command": "npx", "args": ["--no-install", "rsync", "-av", "dist/", "user@host:/var/www/"]
dependsOn 写了却还是并行上传?
VSCode 默认只保证任务“启动顺序”,不等前一个结束就开下一个——尤其当构建命令是 tsc --build 这种瞬时完成的,问题不大;但如果你用了 webpack serve 或 make -j 这类异步/多线程命令,dependsOn 就不够用了。
- 必须加
"isBackground": false(默认值,但显式写出更安全),否则 VSCode 会认为任务已“结束”而提前触发后续任务 - 对长期运行的任务(如 watch 模式),要配
"problemMatcher": []并设"isBackground": true,否则输出会被截断或误判为失败 - 如果构建脚本本身有并发逻辑(比如 Makefile 里的
-j),得靠脚本内部控制,dependsOn管不到那一层
如何让部署任务跳过构建,只上传已有 dist 目录
这是热修、CI 分离或本地验证的刚需,关键不是“怎么跳过”,而是“怎么设计两个正交任务”。
- 定义两个独立 task:
"label": "build"和"label": "upload:dist",后者不设dependsOn,也不调用任何构建命令 -
upload:dist的"args"直接引用已有产物:["-av", "${workspaceFolder}/dist/", "user@host:/path/"] - 若需切换目标服务器,别硬编码 IP,改用
${input:deployTarget},并在inputs数组里定义选项列表,VSCode 会弹出选择框 - 加
"problemMatcher": [],防止rsync的进度行(如12345678 100% ...)被误识别为错误并中断任务
真正卡住人的从来不是 JSON 语法,而是 PATH 加载时机、shell 类型(bash vs PowerShell)、后台任务的生命周期管理这三块——尤其是当你在 macOS 上用 Homebrew 安装了 rsync 却在任务里调用系统自带旧版时,版本差异可能让 --delete-delay 这类参数直接失效。











