環境變數配置
內容:
摘要
問題
我哋想令我哋嘅應用程式喺工件/二進位檔/原始碼之外都可以配置,令同一個建置可以按部署環境而有唔同嘅行為。
為咗做到呢點,我哋想用環境變數配置。
我哋想用可以做版本控制嘅檔案嚟管理配置。
我哋想提供一啲開發者體驗上嘅便利,例如知道有咩可以配置,以及任何相關嘅預設值。
決策
決定用 .env 檔案,並配合相關嘅預設值檔案同結構描述檔案。
狀態
已決定。對日後出現嘅新功能持開放態度。
詳情
假設
我哋傾向將應用程式程式碼同環境程式碼分開。我哋假設應用程式需要喺不同環境(例如開發環境、測試環境、示範環境、生產環境等)有唔同嘅運作方式。
我哋傾向採用業界慣例「12 factor app」,更傾向相關嘅「15 factor app」做法。
我哋以往好多項目都用 .env 檔案或者類似 .env 目錄嘅慣例。一般做法係唔將呢啲檔案放入版本控制,而係用其他方式去部署、做版本管理同管理佢哋。
限制
我哋想將機密排除喺原始碼管理(SCM)版本控制系統(VCS)之外。
我哋想盡量兼容流行嘅軟件框架同程式庫。例如,Node 有個模組「dotenv」用嚟讀取環境變數配置。
立場
我哋考慮過幾種做法:
將配置儲存喺應用程式入面,例如放喺
config.js檔案。將配置儲存喺環境入面,例如放喺
.env檔案。從已知位置(例如授權伺服器)取得配置。
論據
我哋揀選 .env 檔案嘅做法,因為:
佢好流行,專家之間亦然。
佢跟隨
.env檔案嘅模式,我哋嘅團隊喺好多項目都成功用過好多次。佢簡單。值得留意嘅係,對於我哋睇到嘅重大取捨(例如同授權伺服器做法相比欠缺審計能力),我哋暫時可以接受。
影響
我哋需要想辦法,將公開嘅環境變數配置同任何機密管理分開。
相關
相關決策
我哋預期所有應用程式都會用呢個做法。
我哋會計劃升級任何用能力較低嘅做法(例如硬編碼喺二進位檔或者原始碼)嘅應用程式。
我哋會維持任何用能力較高嘅做法(例如授權伺服器)嘅應用程式不變。
相關需求
我哋會為呢啲檔案加入 devops 能力,包括鉤子(hooks)、測試同持續整合。
我哋需要就呢個決策培訓所有開發隊友。
相關工件
我哋部署嘅每個區域都需要自己嘅 .env 檔案同相關檔案。
相關原則
容易回復。
備註
.env 檔案例子:
NAME=Alice Anderson
EMAIL=alice@example.com
.env.defaults 檔案例子:
NAME=Joe Doe
EMAIL=joe@example.com
只有鍵嘅 .env.schema 檔案例子:
NAME
EMAIL