框架提供了強大且可擴展的配置功能,可以自動合并應(yīng)用、插件、框架的配置,按順序覆蓋,且可以根據(jù)環(huán)境維護不同的配置。合并后的配置可直接從 app.config 獲取。
配置的管理有多種方案,以下列一些常見的方案
我們選擇了最后一種配置方案,配置即代碼,配置的變更也應(yīng)該經(jīng)過 review 后才能發(fā)布。應(yīng)用包本身是可以部署在多個環(huán)境的,只需要指定運行環(huán)境即可。
框架支持根據(jù)環(huán)境來加載配置,定義多個環(huán)境的配置文件,具體環(huán)境請查看運行環(huán)境配置
config |
config.default.js 為默認的配置文件,所有環(huán)境都會加載這個配置文件,一般也會作為開發(fā)環(huán)境的默認配置文件。
當指定 env 時會同時加載對應(yīng)的配置文件,并覆蓋默認配置文件的同名配置。如 prod 環(huán)境會加載 config.prod.js 和 config.default.js 文件,config.prod.js 會覆蓋 config.default.js 的同名配置。
配置文件返回的是一個 object 對象,可以覆蓋框架的一些配置,應(yīng)用也可以將自己業(yè)務(wù)的配置放到這里方便管理。
// 配置 logger 文件的目錄,logger 默認配置由框架提供 |
配置文件也可以簡化的寫成 exports.key = value 形式
exports.keys = 'my-cookie-secret-key'; |
配置文件也可以返回一個 function,可以接受 appInfo 參數(shù)
// 將 logger 目錄放到代碼目錄下 |
內(nèi)置的 appInfo 有
appInfo | 說明 |
---|---|
pkg | package.json |
name | 應(yīng)用名,同 pkg.name |
baseDir | 應(yīng)用代碼的目錄 |
HOME | 用戶目錄,如 admin 賬戶為 /home/admin |
root | 應(yīng)用根目錄,只有在 local 和 unittest 環(huán)境下為 baseDir,其他都為 HOME。 |
appInfo.root 是一個優(yōu)雅的適配,比如在服務(wù)器環(huán)境我們會使用 /home/admin/logs 作為日志目錄,而本地開發(fā)時又不想污染用戶目錄,這樣的適配就很好解決這個問題。
請根據(jù)具體場合選擇合適的寫法,但請確保沒有寫出以下代碼:
// config/config.default.js |
應(yīng)用、插件、框架都可以定義這些配置,而且目錄結(jié)構(gòu)都是一致的,但存在優(yōu)先級(應(yīng)用 > 框架 > 插件),相對于此運行環(huán)境的優(yōu)先級會更高。
比如在 prod 環(huán)境加載一個配置的加載順序如下,后加載的會覆蓋前面的同名配置。
-> 插件 config.default.js |
注意:插件之間也會有加載順序,但大致順序類似,具體邏輯可查看加載器。
配置的合并使用 extend2 模塊進行深度拷貝,extend2 fork 自 extend,處理數(shù)組時會存在差異。
const a = { |
根據(jù)上面的例子,框架直接覆蓋數(shù)組而不是進行合并。
框架在啟動時會把合并后的最終配置 dump 到 run/application_config.json(worker 進程)和 run/agent_config.json(agent 進程)中,可以用來分析問題。
配置文件中會隱藏一些字段,主要包括兩類:
還會生成 run/application_config_meta.json(worker 進程)和 run/agent_config_meta.json(agent 進程)文件,用來排查屬性的來源,如
{ |
更多建議: