launch.json的env字段最可靠,因为调试器直接注入子进程,不受shell类型或远程连接方式影响,优先级最高且作用域隔离。

VSCode 调试时的环境变量必须通过 launch.json 的 env 字段显式注入,系统环境变量或 shell 配置文件(如 .bashrc)里的变量默认不会自动继承到调试会话中。
为什么 launch.json 的 env 是最可靠的方式
VSCode 启动调试进程时,通常使用非交互式 shell(比如 /bin/sh -c),它跳过 .bashrc、.zshenv 等初始化脚本,因此你在终端里 echo $NODE_ENV 能看到的值,在调试里大概率是空的。而 launch.json 中的 env 是调试器直接设置给子进程的,优先级最高,不受 shell 类型或远程连接方式干扰。
- Remote-SSH 或 Dev Containers 场景下,这个机制依然生效
- 变量名大小写敏感,
NODE_ENV和node_env是两个不同变量 - 敏感信息(如
API_KEY)不应明文写进env,建议用${env:API_KEY}引用系统变量,或配合.env文件 +dotenv加载
launch.json 里 env 怎么写才不出错
必须是合法 JSON 对象,键为字符串,值也为字符串;不能嵌套,不能有注释,不能用单引号。
- 正确写法:
"env": { "NODE_ENV": "development", "PORT": "3000" } - 错误写法:
"env": { NODE_ENV: "development" }(键没加引号) - 错误写法:
"env": { "DEBUG": "app*" }(*在某些 shell 下会被展开,建议用双引号包裹并转义,或改用app\*) - 路径类变量注意跨平台:
"PATH": "${env:PATH}:/usr/local/bin"在 Linux/macOS 有效,Windows 应用${env:Path}和分号分隔
想动态换环境变量?别硬编码,用 ${input:}
每次调试都要改 env 值太麻烦,可以用 ${input:xxx} 实现运行时选择,适合多环境切换(dev/test/prod)。
- 在
launch.json的配置项里加inputs数组,定义输入类型(promptString或pickString) -
args和env都支持引用:"env": { "RUN_MODE": "${input:runMode}" } - 注意:
inputs必须和configurations同级,不是嵌套在某个配置里 - 如果只用于调试,不希望污染构建任务,就不要把这类变量塞进
tasks.json的env
常见报错和对应检查点
调试启动后程序读不到预期变量,先看这几个地方:
-
env字段拼写错误:不是environment或ENV,必须是小写env - 变量名被覆盖:代码里调用了
process.env.NODE_ENV = 'test',会覆盖launch.json设置的值 - 调试器类型不匹配:Python 配置里用了
type: "node",或反过来,会导致env不生效 -
console: "integratedTerminal"模式下,env仍生效,但终端里手动执行的命令不会继承它——那是另一个进程
最易被忽略的一点:launch.json 改了之后,必须重启调试会话(按 Shift+F5 停掉再 F5),热重载不触发环境变量重载。


















