Managing application configuration
Mix tasks run in a specific environment. The predefined environments are production, development, and test (prod, dev, and test). The default environment is dev. In this recipe, we will configure an application with different values for each environment. Invoking the same function will result in a different output based on the configuration.
How to do it…
To manage an application configuration, we follow these steps:
- Create a new application:
> mix new config_example
- Go to the generated application directory and open
config/config.exs
. - Replace all of the file's content with the following code:
use Mix.Config config :config_example, message_one: "This is a shared message!" import_config "#{Mix.env}.exs"
- Create three more files under the
config
directory with the following code:- In
config/dev.exs
, add the following:use Mix.Config config :config_example, message_two: "I'm a development environment message!"
- In
config/prod.exs
, add this code:use Mix.Config config :config_example, message_two: "I'm a production environment message!"
- In
config/test.exs
, add the following:use Mix.Config config :config_example, message_two: "I'm a test environment message!"
- In
- Define two module attributes in
lib/config_example.ex
to hold the values ofmessage_one
andmessage_two
, as follows:@message_one Application.get_env(:config_example, :message_one) @message_two Application.get_env(:config_example, :message_two)
- Create a
show_messages
function inlib/config_example.ex
, like this:def show_messages do IO.puts "Message one is: #{@message_one}" IO.puts "Message two is: #{@message_two}" end
- Start the application in the three different environments and see the output of the
show_messages
function:- For the development environment, start the application as follows:
> MIX_ENV=dev iex –S mix iex(1)> ConfigExample.show_messages Message one is: This is a shared message! Message two is: I'm a development environment message! :ok iex(2)>
- For the production environment, start the application like this:
> MIX_ENV=prod iex –S mix iex(1)> ConfigExample.show_messages Message one is: This is a shared message! Message two is: I'm a production environment message! :ok iex(2)>
- For the test environment, start the application as follows:
> MIX_ENV=test iex –S mix iex(1)> ConfigExample.show_messages Message one is: This is a shared message! Message two is: I'm a test environment message! :ok iex(2)>
- For the development environment, start the application as follows:
How it works…
When we include the last line in config.exs
(import_config "#{Mix.env}.exs"
), the Mix configuration is loaded from the files, in this case with the Mix environment as its name and .exs
as its extension.
The configuration from the imported files will override any existing configuration (with the same key) in the config.exs
file. In fact, Configuration values are merged recursively. See the example at https://github.com/alco/mix-config-example.
To access configuration values, we use Application.get_env(:app, :key)
.