檢視原始碼 Config (Elixir v1.16.2)
一個簡單的基於關鍵字的配置 API。
範例
這個模組最常使用於定義應用程式配置,通常在 config/config.exs
import Config
config :some_app,
key1: "value1",
key2: "value2"
import_config "#{config_env()}.exs"
import Config
將匯入函式 config/2
、config/3
、config_env/0
、config_target/0
和 import_config/1
以協助您管理您的配置。
config/2
和 config/3
用於定義給定應用程式的鍵值配置。一旦 Mix 開始,它將自動評估配置檔案,並將上述配置保留在 :some_app
的應用程式環境中,可透過以下方式存取
"value1" = Application.fetch_env!(:some_app, :key1)
最後,程式碼行 import_config "#{config_env()}.exs"
將根據目前的配置環境匯入其他設定檔,例如 config/dev.exs
和 config/test.exs
。
Config
也提供用於評估和讀取配置的低階 API,在 Config.Reader
模組下。
避免在函式庫中使用應用程式環境
如果您正在撰寫供其他開發人員使用的函式庫,通常建議避免使用應用程式環境,因為應用程式環境實際上是一個全域儲存。另外請注意,當函式庫作為依賴項使用時,函式庫的
config/config.exs
沒有評估,因為配置總是用於配置目前的專案。如需更多資訊,請閱讀我們的 函式庫指南。
從 use Mix.Config
遷移
Config
模組在 Elixir 中於 v1.9 中引入,作為 use Mix.Config
的替代品,後者專屬於 Mix,且已棄用。
你可以使用 Config
取代 use Mix.Config
,步驟如下:首先,將設定檔最上方的 use Mix.Config
替換成 import Config
。
其次,確認你的 import_config/1
呼叫沒有萬用字元。如果有,你需要手動執行萬用字元查詢。例如,如果你這樣寫:
import_config "../apps/*/config/config.exs"
必須替換成:
for config <- "../apps/*/config/config.exs" |> Path.expand(__DIR__) |> Path.wildcard() do
import_config config
end
最後,將設定檔中所有 Mix.env()
呼叫替換成 config_env()
。
請注意,你必須避免在專案檔案中使用 Mix.env()
。若要在 *執行階段* 檢查環境,你可以新增一個組態金鑰:
# config.exs
...
config :my_app, env: config_env()
然後,在其他指令碼和模組中,你可以使用 Application.fetch_env!/2
取得環境。
# router.exs
...
if Application.fetch_env!(:my_app, :env) == :prod do
...
end
你只能在 mix.exs
檔案和自訂 Mix 任務(始終在 Mix.Tasks
名稱空間中)存取 Mix
模組中的函式。
config/runtime.exs
對於執行階段組態,你可以使用 config/runtime.exs
檔案。它會在 Mix 和發行版(使用 mix release
組合)中的應用程式啟動之前執行。
摘要
函式
組態指定的 root_key
。
關鍵字清單總是深度合併。
範例
提供的 opts
會合併到既有設定中,用於指定的 root_key
。衝突的鍵會被 opts
中指定的鍵覆寫,除非它們是關鍵字,而關鍵字會遞迴深度合併。例如,下列應用程式設定
config :logger,
level: :warn,
backends: [:console]
config :logger,
level: :info,
truncate: 1024
會對 :logger
有以下最終設定
[level: :info, backends: [:console], truncate: 1024]
為指定的 root_key
組態指定的 key
。
關鍵字清單總是深度合併。
範例
提供的 opts
會合併到既有值中,用於指定的 root_key
中的 key
。衝突的鍵會被 opts
中指定的鍵覆寫,除非它們是關鍵字,而關鍵字會遞迴深度合併。例如,下列應用程式設定
config :ecto, Repo,
log_level: :warn,
adapter: Ecto.Adapters.Postgres,
metadata: [read_only: true]
config :ecto, Repo,
log_level: :info,
pool_size: 10,
metadata: [replica: true]
會對 :ecto
應用程式中 Repo
鍵的設定有以下最終值
Application.get_env(:ecto, Repo)
#=> [
#=> log_level: :info,
#=> pool_size: 10,
#=> adapter: Ecto.Adapters.Postgres,
#=> metadata: [read_only: true, replica: true]
#=> ]
傳回執行此組態檔的環境。
在 Mix 專案中,此函式會傳回執行此設定檔的環境。在發行版本中,則會傳回執行 mix release
時的環境。
這最常被用來執行條件式程式碼
if config_env() == :prod do
config :my_app, :debug, false
end
傳回執行此組態檔的目標。
這最常被用來執行條件式程式碼
if config_target() == :host do
config :my_app, :debug, false
end
從指定的檔案匯入組態。
如果檔案不存在,會引發錯誤。
如果檔案是相對路徑,會相對於目前設定檔所在的目錄展開。
範例
這通常用來模擬跨環境的設定
import_config "#{config_env()}.exs"
不過請注意,有些設定檔,例如 config/runtime.exs
不支援匯入,因為它們是要複製到各系統的。