调试环境变量必须显式配置在 launch.json 的 env 或 envfile 字段中,vscode 不继承终端或系统变量;env 为对象结构、大小写敏感、支持单层 ${env:var} 引用;envfile 路径须绝对且 utf-8 无 bom;修改后需重启调试会话。

调试时的环境变量必须显式注入 launch.json,VSCode 不会自动继承终端或系统变量。
launch.json 的 env 字段是唯一可靠方式
VSCode 调试器启动的进程与终端完全隔离,env 字段是向被调试进程传递变量的唯一标准路径。它不依赖任何插件或运行时加载逻辑,只要配置正确,Node.js、Python、C++、Go 等所有语言调试器都认。
-
env是对象结构,键为变量名(如NODE_ENV),值为字符串;大小写敏感,node_env和NODE_ENV是两个不同变量 - 支持
${env:PATH}这类引用语法,但仅限一层展开,不能嵌套(如${env:HOME}/bin可用,${env:HOME}/bin:${env:PATH}也可用,但${env:HOME}/bin:${env:OTHER_VAR}中OTHER_VAR必须已存在于系统或父进程中) - 若需追加路径到
PATH,必须手动拼接:"PATH": "${env:PATH}:/usr/local/bin",否则会覆盖原始值 - 敏感信息(如
API_KEY)不应明文写在launch.json中,应配合envFile或代码侧dotenv加载
envFile 仅对调试生效,且路径必须绝对
想从 .env 文件加载变量?envFile 字段就是为此设计的,但它只作用于调试会话,和终端、构建任务无关。
- 路径必须使用
${workspaceFolder}表达式,例如:"envFile": "${workspaceFolder}/.env";写成./.env或.env在部分 VSCode 版本中会失败 -
.env文件必须位于项目根目录(与package.json或tasks.json同级),编码为 UTF-8 无 BOM(右下角状态栏确认,否则dotenv会静默失败) - 修改
.env后必须重启调试会话——VSCode 不监听该文件变更,也不会热重载 -
envFile和env可共存,env中同名变量会覆盖envFile中的值
别指望终端环境自动透传给调试器
你在内置终端里执行 export NODE_ENV=development,然后点“开始调试”,被调试进程依然看不到这个变量——这是最常被误解的一点。
- 终端和调试器是两个独立进程,环境变量不共享;即使你通过
terminal.integrated.env.*配置了终端变量,它们也不会流入launch.json - 如果你依赖 nvm 或 pyenv 切换运行时版本,
env里设NODE_HOME没用,得改runtimeExecutable指向具体可执行路径(如/Users/xxx/.nvm/versions/node/v20.15.0/bin/node) - Java 调试时设
JAVA_HOME是必要的,但仅靠java.home设置(在 Settings 里)不会让 JVM 进程读到它——java.home只影响扩展自身,不影响被调试进程
真正容易被忽略的是:launch.json 中的变量作用域仅限单个 configuration,且所有字段(包括 env 和 envFile)都受当前配置的 type 和 request 约束;一个配置写错,另一个配置不会受影响,排查时容易漏掉非默认 configuration。











