.env 文件是现代开发中最常见的配置文件之一。遵循 Twelve-Factor App 方法论的项目几乎都依赖它来管理环境变量。然而 .env 没有正式规范,细微的语法问题——缺少引号、多余空格、重复键——在文本编辑器里完全看不出来,直到运行时才爆出 bug。在线 .env 解析工具让你无需上传数据、无需安装任何工具,就能即时检查和验证 .env 文件。
.env 文件是什么?
.env 文件以纯文本键值对的形式存储环境变量。这一约定由 Node.js 的 dotenv 库推广,现已扩展到几乎每个语言生态系统。
# 应用配置
APP_NAME=MyApp
APP_ENV=production
APP_PORT=3000
# 数据库
DATABASE_URL=postgres://user:password@localhost:5432/mydb
DATABASE_POOL_SIZE=10
# API 密钥
STRIPE_SECRET_KEY=sk_live_...
SENDGRID_API_KEY=SG.xxxxxxxx
python-dotenv、godotenv、Rails 内置的 dotenv 支持等库会在应用启动时读取这些值,并注入到 process.env(Node.js)、os.environ(Python)或对应的环境变量机制中。
.env 语法规则
.env 看起来简单,但各实现之间存在细微差异:
基本键值对
KEY=value
= 两侧不能有空格。键名约定使用 大写下划线,但小写也合法。
带引号的值
当值包含空格、特殊字符,或需要保留首尾空白时,使用引号:
APP_DESCRIPTION="我的应用程序"
GREETING='Hello, World!'
单引号和双引号都合法。双引号字符串支持 \n、\t、\" 等转义序列。
多行值
双引号括起来的值可以跨行:
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA...
-----END RSA PRIVATE KEY-----"
注释
以 # 开头的行是注释。部分实现也支持行尾注释:
# 这是注释
PORT=8080 # 部分库会解析这段行尾注释
变量插值
部分 dotenv 库支持变量引用:
BASE_URL=https://api.example.com
API_ENDPOINT=${BASE_URL}/v1
export 前缀
大多数解析器支持 export 前缀(为了与 shell 兼容):
export DATABASE_URL=postgres://localhost/mydb
常见 .env 语法错误
这些错误在文本编辑器里完全看不出来,却会导致运行时故障:
等号两侧有空格
# 错误——大多数解析器会把 "KEY " 当成键名
KEY = value
# 正确
KEY=value
包含特殊字符的值未加引号
# 错误——# 会被当成注释,截断值
PASSWORD=abc#123
# 正确
PASSWORD="abc#123"
重复键
DATABASE_URL=postgres://dev-host/mydb
DATABASE_URL=postgres://prod-host/mydb # 静默覆盖第一个
Windows 风格换行(CRLF)
在 Windows 上创建的 .env 文件可能使用 \r\n 换行。部分解析器能正确处理,另一些则会产生以 \r 结尾的键名,导致 KEY\r !== KEY 的隐蔽 bug。
含等号的值未加引号
# 错误——部分解析器在第二个 = 处截断
API_KEY=abc=def=ghi
# 正确
API_KEY="abc=def=ghi"
各语言解析 .env 的方式
Node.js(dotenv)
npm install dotenv
require('dotenv').config();
console.log(process.env.DATABASE_URL);
ES 模块写法:
import 'dotenv/config';
console.log(process.env.DATABASE_URL);
Python(python-dotenv)
pip install python-dotenv
from dotenv import load_dotenv
import os
load_dotenv() # 从当前目录读取 .env
database_url = os.getenv('DATABASE_URL')
仅解析不注入环境变量:
from dotenv import dotenv_values
config = dotenv_values(".env")
print(config) # OrderedDict 键值对
Go(godotenv)
go get github.com/joho/godotenv
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load()
if err != nil {
log.Fatal("读取 .env 文件失败")
}
fmt.Println(os.Getenv("DATABASE_URL"))
}
Shell(bash)
# 将 .env 中的所有变量导出到当前 shell
set -a
source .env
set +a
.env 最佳实践
永远不要把 .env 提交到版本库。 立即加入 .gitignore,改用 .env.example 存放占位值。
# .gitignore
.env
.env.local
.env.production
按环境使用独立文件。 大多数框架支持 .env.development、.env.production、.env.test,根据 NODE_ENV 或等效变量自动加载对应文件。
启动时验证必需变量。 envalid(Node.js)或 pydantic-settings(Python)允许你为环境变量定义 schema,在缺少必需值或类型错误时立即失败,而不是等到运行时才爆出问题。
# pydantic-settings 示例
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
database_url: str
app_port: int = 3000
app_env: str = "development"
settings = Settings() # 自动从环境变量或 .env 读取并验证
定期轮换密钥。 .env 文件通常包含 API 密钥和数据库凭据,需像对待敏感材料一样对待——定期轮换,尤其是在团队成员离职后。
将 .env 导出为 JSON
.env 转 JSON 的常见场景:
- 为只接受 JSON 的工具提供配置(AWS Lambda、Terraform
var-file) - 跨环境对比配置
- 在 CI/CD 流水线中记录配置文档
from dotenv import dotenv_values
import json
config = dotenv_values(".env")
print(json.dumps(dict(config), indent=2, ensure_ascii=False))
输出:
{
"APP_NAME": "MyApp",
"APP_ENV": "production",
"APP_PORT": "3000",
"DATABASE_URL": "postgres://user:password@localhost:5432/mydb"
}
注意:JSON 输出中所有值都是字符串——.env 没有类型系统,类型转换由应用层负责。
在线 .env 文件解析工具
需要快速检查、调试或格式转换,但不想运行任何代码?ZeroTool 的 .env 文件解析器完全在浏览器内运行,无需上传任何数据。功能包括:
- 以清晰表格可视化所有键值对
- 行级语法错误高亮
- 重复键检测
- 一键导出为 JSON