Elixir v1.10.0-dev Config View Source

A simple keyword-based configuration API.

Example

This module is most commonly used to define application configuration, typically in config/config.exs:

import Config

config :some_app,
  key1: "value1",
  key2: "value2"

import_config "#{Mix.env()}.exs"

import Config will import the functions config/2, config/3 and import_config/1 to help you manage your configuration.

config/2 and config/3 are used to define key-value configuration for a given application. Once Mix starts, it will automatically evaluate the configuration file and persist the configuration above into :some_app's application environment, which can be accessed in as follows:

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

Finally, the line import_config "#{Mix.env()}.exs" will import other config files, based on the current Mix environment, such as config/dev.exs and config/test.exs.

Config also provides a low-level API for evaluating and reading configuration, under the Config.Reader module.

Important: if you are writing a library to be used by other developers, it is generally recommended to avoid the application environment, as the application environment is effectively a global storage. For more information, read our library guidelines.

Migrating from use Mix.Config

The Config module in Elixir was introduced in v1.9 as a replacement to Mix.Config, which was specific to Mix and has been deprecated.

You can leverage Config instead of Mix.Config in two steps. The first step is to replace use Mix.Config at the top of your config files by import Config.

The second is to make sure your import_config/1 calls do not have a wildcard character. If so, you need to perform the wildcard lookup manually. For example, if you did:

import_config "../apps/*/config/config.exs"

It has to be replaced by:

for config <- "../apps/*/config/config.exs" |> Path.expand(__DIR__) |> Path.wildcard() do
  import_config config
end

config/releases.exs

If you are using releases, see mix release, there is another configuration file called config/releases.exs. While config/config.exs and friends mentioned in the previous section are executed whenever you run a Mix command, including when you assemble a release, config/releases.exs is execute every time your production system boots. Since Mix is not available in a production system, config/releases.exs must not use any of the functions from Mix.

Link to this section Summary

Functions

Configures the given root_key.

Configures the given key for the given root_key.

Imports configuration from the given file.

Link to this section Functions

Link to this function

config(root_key, opts)

View Source (since 1.9.0)

Configures the given root_key.

Keyword lists are always deep-merged.

Examples

The given opts are merged into the existing configuration for the given root_key. Conflicting keys are overridden by the ones specified in opts. For example, the application configuration below

config :logger,
  level: :warn,
  backends: [:console]

config :logger,
  level: :info,
  truncate: 1024

will have a final configuration for :logger of:

[level: :info, backends: [:console], truncate: 1024]
Link to this function

config(root_key, key, opts)

View Source (since 1.9.0)

Configures the given key for the given root_key.

Keyword lists are always deep merged.

Examples

The given opts are merged into the existing values for key in the given root_key. Conflicting keys are overridden by the ones specified in opts. For example, the application configuration below

config :ecto, Repo,
  log_level: :warn,
  adapter: Ecto.Adapters.Postgres

config :ecto, Repo,
  log_level: :info,
  pool_size: 10

will have a final value of the configuration for the Repo key in the :ecto application of:

[log_level: :info, pool_size: 10, adapter: Ecto.Adapters.Postgres]
Link to this macro

import_config(file)

View Source (macro) (since 1.9.0)

Imports configuration from the given file.

In case the file doesn't exist, an error is raised.

If file is a relative, it will be expanded relatively to the directory the current configuration file is in.

Examples

This is often used to emulate configuration across environments:

import_config "#{Mix.env()}.exs"