# Elixir v1.10.3 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 executed 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

config(root_key, opts)

Configures the given `root_key`.

config(root_key, key, opts)

Configures the given `key` for the given `root_key`.

import_config(file)

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"