EnvFile 是 Sublime Text 唯一稳定支持多环境 .env 文件优先级加载的插件,需以项目方式打开、显式配置 build env:{} 才生效,且仅作用于 Sublime 内部子进程。

EnvFile 插件是唯一靠谱的 dotenv 加载方案
Sublime Text 本身不读取 .env 文件,也不自动注入环境变量。所谓“管理多个环境变量”,实际就是让 Build System 或插件在运行时能加载对应 .env.development、.env.production 这类文件里的键值对。EnvFile 是目前唯一稳定支持多环境文件优先级(如 development → fallback to .env)的插件,且兼容 ST3/ST4。
安装后它不会自动生效——必须确保当前窗口已打开项目根目录(即包含 .env* 文件的文件夹),且该目录被 Sublime 识别为“project root”。如果只是单个文件打开,EnvFile 不会触发。
- 用
Project > Add Folder to Project添加整个项目目录,再Project > Save Project As生成.sublime-project - EnvFile 默认只加载
.env、.env.development、.env.production;若要用.env.staging,需在.sublime-project中显式配置:"env_file": { "file": ".env.staging" } - 它只影响 Build System 和部分插件(如 SublimeREPL),不影响 Python 控制台或终端里直接敲的
python script.py
Build System 必须显式启用 EnvFile 注入
即使装了 EnvFile,新建的 Build System 默认仍看不到 .env 里的变量。你得在构建定义里加 "env": {} 空对象,EnvFile 才会把加载到的变量 merge 进去。否则 os.getenv("API_KEY") 在脚本里始终是 None。
比如想让 Python 构建命令读取 .env.development:
{
"cmd": ["python", "-u", "$file"],
"selector": "source.python",
"env": {}
}
注意:"env": {} 不能写成 "env": null 或直接删掉,否则 EnvFile 跳过注入;也不能写成 "env": {"PATH": "$PATH"} —— 这样会覆盖 EnvFile 的合并逻辑,导致 .env 变量丢失。
别指望 EnvFile 影响 Shell 或系统级命令
EnvFile 只作用于 Sublime 内部启动的子进程(Build System、REPL、某些插件命令)。你在 Terminal 里敲 subl . 或 subl myfile.py,跟 EnvFile 完全无关;同样,用 Tools > Build With > Python 调起的构建,才走 EnvFile 流程。
- 如果你在 Build System 里调用了
sh或bash脚本,EnvFile 注入的变量**不会透传到 shell 子进程中**,除非你在构建里手动用export KEY=VALUE; ./script.sh拼接 - Windows 用户尤其要注意:EnvFile 加载的变量名默认转成大写(
api_key→API_KEY),但 Python 的os.getenv()区分大小写,所以建议.env文件里统一用大写 KEY - macOS 上如果用了 zsh,且
.zshrc里有export PYTHONPATH=...,这些变量和 EnvFile 互不干扰,别混淆层级
项目级环境变量和全局配置容易冲突
EnvFile 的变量只对当前项目生效,但 Build System 是全局的。如果你在 Preferences > Package Settings > EnvFile > Settings 里写了 "env_file": { "file": ".env.production" },那所有项目都会强制加载 production 环境——这违背“多环境”本意。
正确做法是:每个项目的 .sublime-project 单独控制,例如:
{
"folders": [{ "path": "." }],
"settings": {
"env_file": {
"file": ".env.development"
}
}
}
这样切换项目时,EnvFile 自动按需加载,不用手动改设置。但要注意:.sublime-project 里的 "env_file" 设置优先级高于用户级设置,且只对该项目有效——这点常被忽略,导致以为改了全局设置就能一劳永逸。

















