#
View Source Config.Reader (Elixir v1.15.7)

API for reading config files defined with `Config`.

## As a provider

`Config.Reader` can also be used as a `Config.Provider`. A config provider is used during releases to customize how applications are configured. When used as a provider, it expects a single argument: the configuration path (as outlined in `Config.Provider.config_path/0`) for the file to be read and loaded during the system boot.

For example, if you expect the target system to have a config file in an absolute path, you can add this inside the `def project` portion of your `mix.exs`:

    releases: [
      demo: [
        config_providers: [
          {Config.Reader, "/etc/config.exs"}
        ]
      ]
    ]

Or if you want to read a custom path inside the release:

    config_providers: [{Config.Reader, {:system, "RELEASE_ROOT", "/config.exs"}}]

You can also pass a keyword list of options to the reader, where the `:path` is a required key:

    config_providers: [
      {Config.Reader,
       path: "/etc/config.exs",
       env: :prod,
       imports: :disabled}
    ]

Remember Mix already loads `config/runtime.exs` by default. For more examples and scenarios, see the `Config.Provider` module.

# Summary

## Functions

eval!(file, contents, opts \\ [])

Evaluates the configuration `contents` for the given `file`.

merge(config1, config2)

Merges two configurations.

read!(file, opts \\ [])

Reads the configuration file.

read_imports!(file, opts \\ [])

Reads the given configuration file and returns the configuration with its imports.

# Functions

Link to this function

# eval!(file, contents, opts \\ [])

View Source (since 1.11.0)

    @spec eval!(Path.t(), binary(), keyword()) :: keyword()

Evaluates the configuration `contents` for the given `file`.

Accepts the same options as `read!/2`.

Link to this function

# merge(config1, config2)

View Source (since 1.9.0)

    @spec merge(keyword(), keyword()) :: keyword()

Merges two configurations.

The configurations are merged together with the values in the second one having higher preference than the first in case of conflicts. In case both values are set to keyword lists, it deep merges them.

## Examples

    iex> Config.Reader.merge([app: [k: :v1]], [app: [k: :v2]])
    [app: [k: :v2]]

    iex> Config.Reader.merge([app: [k: [v1: 1, v2: 2]]], [app: [k: [v2: :a, v3: :b]]])
    [app: [k: [v1: 1, v2: :a, v3: :b]]]

    iex> Config.Reader.merge([app1: []], [app2: []])
    [app1: [], app2: []]

Link to this function

# read!(file, opts \\ [])

View Source (since 1.9.0)

    @spec read!(
      Path.t(),
      keyword()
    ) :: keyword()

Reads the configuration file.

## Options

- `:imports` - a list of already imported paths or `:disabled` to disable imports

- `:env` - the environment the configuration file runs on. See `Config.config_env/0` for sample usage

- `:target` - the target the configuration file runs on. See `Config.config_target/0` for sample usage

Link to this function

# read_imports!(file, opts \\ [])

View Source (since 1.9.0)

    @spec read_imports!(
      Path.t(),
      keyword()
    ) :: {keyword(), [Path.t()]}

Reads the given configuration file and returns the configuration with its imports.

Accepts the same options as `read!/2`. Although note the `:imports` option cannot be disabled in `read_imports!/2`.