檢視原始碼 config

組態檔。

描述

組態檔 包含系統中應用程式組態參數的值。erl 命令列參數 -config Name 告訴系統使用系統組態檔 Name.config 中的資料。

erl 命令列參數 -configfd 的運作方式與 -config 選項相同,但它指定一個檔案描述符來讀取組態資料,而不是檔案。

組態檔和檔案描述符中的組態資料會按照它們在命令列上給定的順序讀取。例如,erl -config a -configfd 3 -config b -configfd 4 會導致系統按照以下順序讀取組態資料:a.config、檔案描述符 3b.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 組態中指定的包含檔案不存在或有錯誤,則執行階段系統會在啟動前中止。但是,如果在載入包含檔案時發生錯誤,則安裝新的發行版本不會失敗,而是會傳回錯誤訊息並忽略錯誤的檔案。

另請參閱

app(4), erts:erl(1), OTP 設計原則