环境变量与配置
有些值是不能写进你的代码里的:密钥、数据库密码、某个服务的地址。还有一些值需要随着应用运行的地方而改变。你在笔记本上测试的代码(dev 环境)应该连到一个测试数据库;你的用户真正在用的那个线上应用(prod,即生产环境)必须连到真实的那个——而且用的是同一份代码。
答案就是环境变量(environment variables,常简称 "env vars"):一些有名字的值,它们住在代码之外,并在代码运行时被供给进去。代码说 "把 DATABASE_URL 给我",然后由环境来决定要交出哪一个。
# 一个配置文件(例如 .env)—— 值住在这里,而不是在代码里
DATABASE_URL=postgres://localhost/myapp_dev
STRIPE_SECRET_KEY=sk_test_51H... # dev = 一个测试用的密钥
SEND_REAL_EMAILS=false # 测试时别给真实用户发邮件
有两条规则能帮你省掉实打实的痛苦:
- 密钥绝对不放进代码里。 你代码里的任何东西都可能最终变成公开的(尤其是在一个共享的代码仓库里),而泄露一个支付密钥或数据库密码是一场货真价实的紧急事件。密钥应该放在 env vars 里,并且不进入版本控制。
- dev 和 prod 是不一样的。 重点在于同一份代码在两者里都表现正确,因为是由环境——而不是代码——来决定用哪个数据库和哪些密钥。
同一份代码,两个家——不同的只是那些 env vars:
SAME CODE
/ \
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ DEV │ │ PROD │
│ 你的电脑 │ │ 托管(云端) │
│ 测试数据库 │ │ 真实数据库 │
│ 测试API密钥 │ │ 正式API密钥 │
│ 假邮件 │ │ 真实邮件 │
└─────────────────┘ └─────────────────┘
只有你能看到 你的用户能看到