.env 文件是现代开发中最常见的配置文件之一。遵循 Twelve-Factor App 方法论的项目几乎都依赖它来管理环境变量。然而 .env 没有正式规范,细微的语法问题——缺少引号、多余空格、重复键——在文本编辑器里完全看不出来,直到运行时才爆出 bug。在线 .env 解析工具让你无需上传数据、无需安装任何工具,就能即时检查和验证 .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-dotenvgodotenv、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

立即使用 .env 文件解析器 →