檢視原始碼 config
組態檔。
描述
組態檔 包含系統中應用程式組態參數的值。erl
命令列參數 -config Name
告訴系統使用系統組態檔 Name.config
中的資料。
erl 命令列參數 -configfd
的運作方式與 -config
選項相同,但它指定一個檔案描述符來讀取組態資料,而不是檔案。
組態檔和檔案描述符中的組態資料會按照它們在命令列上給定的順序讀取。例如,erl -config a -configfd 3 -config b -configfd 4
會導致系統按照以下順序讀取組態資料:a.config
、檔案描述符 3
、b.config
和檔案描述符 4
。如果一個組態參數在給定的檔案和檔案描述符中被指定多次,則最後一個會覆蓋前一個。
組態檔或檔案描述符中的組態參數值會覆蓋應用程式資源檔案中的值(請參閱 app(4)
)。組態檔中的值始終會被命令列標誌覆蓋(請參閱 erts:erl(1)
)。
組態參數的值是透過呼叫 application:get_env/1,2
擷取。
檔案語法
組態檔應命名為 Name.config
,其中 Name
可以是任何名稱。
檔案 .config
包含單個 Erlang term,並具有以下語法:
[{Application1, [{Par11, Val11}, ...]},
...
{ApplicationN, [{ParN1, ValN1}, ...]}].
Application = atom()
- 應用程式名稱。Par = atom()
- 組態參數的名稱。Val = term()
- 組態參數的值。
sys.config
當在嵌入式模式下啟動 Erlang 時,假設只會使用一個名為 sys.config
的系統組態檔。此檔案應位於 $ROOT/releases/Vsn
中,其中 $ROOT
是 Erlang/OTP 根安裝目錄,而 Vsn
是發行版本。
發行版處理依賴此假設。當安裝新的發行版本時,會讀取新的 sys.config
並用來更新應用程式的組態。
這表示指定另一個 .config
檔案,或多個 .config
檔案,會導致應用程式組態更新不一致。不過,有一種方法可以從 sys.config
指向其他組態檔。下一節將說明如何執行此操作。
從 sys.config 和 -configfd 組態包含檔案
有一種方法可以從 sys.config
檔案和來自使用 -configfd
命令列參數指定的檔案描述符的組態中包含其他組態檔。
包含檔案的語法可以使用 Erlang 類型語言 描述如下:
[{Application, [{Par, Val}]} | IncludeFile].
IncludeFile = string()
-.config
檔案的名稱。可以省略副檔名.config
。建議使用絕對路徑。如果在sys.config
中使用相對路徑,則會先相對於sys.config
目錄搜尋IncludeFile
,然後相對於模擬器的當前工作目錄搜尋。如果在-configfd
組態中使用相對路徑,則會先相對於包含模擬器啟動腳本的字典搜尋IncludeFile
(另請參閱-boot
命令列參數),然後相對於模擬器的當前工作目錄搜尋。這樣就可以使用sys.config
指出發行版本或使用-config
或-configfd
手動啟動的節點中的其他.config
檔案,而無論當前工作目錄是什麼,結果都相同。
當遍歷 sys.config
或 -configfd
組態的內容並遇到檔名時,會讀取其內容並與目前的結果合併。當找到應用程式組態元組 {Application, Env}
時,它會與目前的結果合併。合併表示新增參數,並覆蓋現有參數值。
範例
sys.config:
["/home/user/myconfig1"
{myapp,[{par1,val1},{par2,val2}]},
"/home/user/myconfig2"].
myconfig1.config:
[{myapp,[{par0,val0},{par1,val0},{par2,val0}]}].
myconfig2.config:
[{myapp,[{par2,val3},{par3,val4}]}].
這會產生 myapp
的以下環境:
[{par0,val0},{par1,val1},{par2,val3},{par3,val4}]
如果在 sys.config
或 -configfd
組態中指定的包含檔案不存在或有錯誤,則執行階段系統會在啟動前中止。但是,如果在載入包含檔案時發生錯誤,則安裝新的發行版本不會失敗,而是會傳回錯誤訊息並忽略錯誤的檔案。