VSCode 的 launch.json 通过 envFile 字段读取 .env 文件,路径须相对于工作区根目录、仅支持单文件、需 UTF-8 无 BOM 编码,且仅在调试启动时加载一次;Python 项目中 python.envFile 作用于终端执行,与 envFile 作用域不同。

VSCode 的 launch.json 里怎么读 .env 文件
VSCode 默认不会自动加载项目根目录下的 .env 文件,哪怕你装了 dotenv 包或用了 Python 的 python-dotenv,调试器启动时照样看不到那些变量。真正起作用的是 launch.json 里的 envFile 字段——它只在调试会话中生效,且路径必须是相对于工作区根目录的。
-
envFile只支持单个文件,不能写成数组;多个环境变量文件得手动合并 - 路径别写成
./.env,直接写.env或./config/.env.local(斜杠方向要对) - 如果项目用的是 TypeScript +
ts-node,envFile依然有效,但前提是调试器配置的runtimeExecutable指向的是ts-node而非node - Windows 下路径分隔符用正斜杠
/更稳妥,VSCode 内部统一处理,反斜杠容易被转义成非法字符
为什么改了 .env 文件,重启调试也不生效
常见错觉是“改完保存就自动重载”,其实 VSCode 的调试器只在启动时读一次 envFile。改了内容不重启调试会话,旧变量照常使用。更隐蔽的问题是:文件编码或 BOM 头导致解析失败,尤其 Windows 记事本保存的 UTF-8 带 BOM,envFile 会静默跳过整份文件,连报错都没有。
- 用 VSCode 自己打开
.env文件,右下角看编码显示,点开选 “Save with Encoding” → “UTF-8”(无 BOM) - 变量值含空格或特殊符号(如
=、#)必须用双引号包裹:API_URL="https://api.example.com/v1" - 注释行必须以
#开头,且前面不能有空格,否则会被当成变量名:# BAD不行,# GOOD才行 - 重复定义的变量以后出现的为准,但 VSCode 不做覆盖提示,容易误以为没生效
Python 项目里 envFile 和 python.envFile 有什么区别
Python 扩展(ms-python.python)额外支持一个 workspace 级配置项:python.envFile。它影响的不是调试器,而是 Python 解释器进程本身——比如你在集成终端里运行 python script.py,或执行代码片段(Ctrl+Enter),这时才用得上它。而 launch.json 里的 envFile 只管 F5 启动的调试会话。
- 两者可以并存,但作用域不同:一个管终端/交互执行,一个管调试器
-
python.envFile在.vscode/settings.json里配置,值是字符串,不是数组 - 如果同时设了
envFile和python.envFile,且内容冲突,调试时以envFile为准,终端里以python.envFile为准 - 注意
python.defaultInterpreterPath必须指向正确解释器,否则python.envFile无效
多项目共用一个 VSCode 窗口时,环境变量怎么隔离
VSCode 没有“每个文件夹独立 launch 配置”的内置机制。如果你用多根工作区(multi-root workspace),所有文件夹共享同一个 .vscode/launch.json,这时候 envFile 路径写相对路径就会出问题——它总是相对于工作区根,而不是各自子文件夹。
- 方案一:每个项目单独开窗口,用
code .进入单根工作区,envFile: ".env"就能各用各的 - 方案二:在 multi-root workspace 中,为每个文件夹单独配一个
launch.json,放在各自.vscode/下,并在launch.json里用envFile指向本项目内的.env(如"../service-a/.env") - 方案三:放弃
envFile,改用env字段硬编码变量,虽然不灵活但绝对隔离,适合 CI/CD 测试环境 - 不要依赖系统级
export或 shell 启动 VSCode,那会导致所有窗口共享同一套变量,根本不可控
环境变量这东西,看着简单,实际卡在路径、编码、作用域三层嵌套里。最常漏掉的是:以为改了 .env 就等于改了运行时,忘了调试器只认启动那一刻的快照。


















