環境變數與配置
有些值是不能寫進你的程式碼裡的:金鑰、資料庫密碼、某個服務的地址。還有一些值需要隨著應用執行的地方而改變。你在筆記本上測試的程式碼(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金鑰 │
│ 假郵件 │ │ 真實郵件 │
└─────────────────┘ └─────────────────┘
只有你能看到 你的使用者能看到