檢視原始碼 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/2config/3config_env/0config_target/0import_config/1 以協助您管理您的配置。

config/2config/3 用於定義給定應用程式的鍵值配置。一旦 Mix 開始,它將自動評估配置檔案,並將上述配置保留在 :some_app 的應用程式環境中,可透過以下方式存取

"value1" = Application.fetch_env!(:some_app, :key1)

最後,程式碼行 import_config "#{config_env()}.exs" 將根據目前的配置環境匯入其他設定檔,例如 config/dev.exsconfig/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

為指定的 root_key 組態指定的 key

傳回執行此組態檔的環境。

傳回執行此組態檔的目標。

從指定的檔案匯入組態。

函式

連結到此函式

config(root_key, opts)

檢視原始碼 (自 1.9.0 起)

組態指定的 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]
連結到此函式

config(root_key, key, opts)

檢視原始碼 (自 1.9.0 起)

為指定的 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]
#=> ]
連結到此巨集

config_env()

檢視原始碼 (自 1.11.0 起) (巨集)

傳回執行此組態檔的環境。

在 Mix 專案中,此函式會傳回執行此設定檔的環境。在發行版本中,則會傳回執行 mix release 時的環境。

這最常被用來執行條件式程式碼

if config_env() == :prod do
  config :my_app, :debug, false
end
連結到此巨集

config_target()

檢視原始碼 (自 1.11.0 起) (巨集)

傳回執行此組態檔的目標。

這最常被用來執行條件式程式碼

if config_target() == :host do
  config :my_app, :debug, false
end
連結到此巨集

import_config(file)

檢視原始碼 (自 1.9.0 起) (巨集)

從指定的檔案匯入組態。

如果檔案不存在,會引發錯誤。

如果檔案是相對路徑,會相對於目前設定檔所在的目錄展開。

範例

這通常用來模擬跨環境的設定

import_config "#{config_env()}.exs"

不過請注意,有些設定檔,例如 config/runtime.exs 不支援匯入,因為它們是要複製到各系統的。