因为vscode的tasks.json运行环境隔离:不继承shell的path、不加载项目级.env、也不自动使用node_modules/.bin,导致command not found等错误;应改用npx --no-install调用本地包,并显式指定shell路径和env字段。

直接写 npm run deploy 为什么在 tasks.json 里总失败
因为 VSCode 的 task 运行环境是隔离的:不继承 shell 的 PATH,不加载项目根目录的 .env,也不自动把 node_modules/.bin 加进可执行路径。你看到的 command not found、cross-env is not recognized 或 Cannot find module 'dotenv',基本都卡在这儿。
别指望它“懂”你的项目环境——它只认你明明白白写进去的东西。
- macOS/Linux 下常见报错:
npm: command not found(zsh 没被正确调起) - Windows PowerShell 下:
File deploy.ps1 cannot be loaded because running scripts is disabled - 哪怕
.env存在,process.env.API_URL在 task 里仍是undefined
用 npx --no-install 替代全局 npm 调用
npx 会优先查找项目本地 node_modules/.bin 下的二进制,--no-install 能避免意外触发 npm install ——部署阶段不该改依赖。
比如你 package.json 里有:"scripts": { "deploy": "cross-env NODE_ENV=production node scripts/deploy.js" },就别写 "command": "npm run deploy",而该写:
"command": "npx --no-install cross-env NODE_ENV=production node scripts/deploy.js"
- 如果脚本本身没依赖
cross-env,直接用node启动并手动设环境变量更稳:"command": "NODE_ENV=production node scripts/deploy.js" - Windows cmd 用户注意:
NODE_ENV=production在 cmd 里无效,得写成set NODE_ENV=production && node scripts/deploy.js - 所有命令路径必须是相对于工作区根目录的,
scripts/deploy.js不能写成./scripts/deploy.js或绝对路径
显式指定 shell 和注入 env 字段
VSCode 不会猜你用什么 shell,也不会自动读 .env 文件。你得亲手告诉它:
- macOS/Linux:
"shell": { "executable": "/bin/zsh", "args": ["-c"] } - Windows cmd:
"shell": { "executable": "cmd.exe", "args": ["/c"] } - 环境变量必须手动列全:
"env": { "NODE_ENV": "production", "API_URL": "https://api.example.com", "SSH_KEY_PATH": "/home/user/.ssh/id_rsa" } - 即使用了
dotenv,task 里也得重复填——dotenv只对 Node.js 进程生效,不影响 shell 环境
dependsOn 和 dependsOrder 怎么配才真串行
dependsOn 默认只控制启动顺序,不是等待完成。比如 vite build 是异步的,scp dist/* 很可能在 dist 目录生成前就执行了。
- 必须加
"isBackground": false(哪怕默认是 false,显式写出来更可靠) - 必须加
"dependsOrder": "sequence",缺了这句,dependsOn就只是“差不多同时开” - 前置任务退出码非 0 时,后续任务不会启动——这是唯一可靠的中断机制
- 如果构建脚本本身不规范(比如用
console.log模拟进度但没真正阻塞),靠 task 机制也救不了,得修脚本
真正容易被忽略的是:VSCode 任务系统不解析 stdout,它只看进程 exit code。部署脚本里任何关键检查(比如 if [ ! -d dist ]; then exit 1; fi)都不能省。











