We needed a way of checking that environment variables were defined and improving the developer experience when they are not.
envar
is our solution to a very specific problem:
the developer experience when a required environment variable is undefined.
Install the package
by adding envar
to your list of dependencies in your mix.exs
file:
def deps do
[
{:envar, "~> 1.1.0"}
]
end
Load an .env
file
containing a line-separated list of environment variables
on your localhost
:
Envar.load(".env")
That will locate the .env
file in your project
and set each environment variable in it.
If the .env
must exist e.g. in a :test
context,
invoke:
Envar.require_env_file(".env")
That will log an Error
if the file does not exist (or can't be found):
09:10:54.103 [error] Required .env file does not exist at path: /Alex/awesome/project/.env
When you need to retrieve a specific environment variable, use the following:
DATABASE_URL = Envar.get("DATABASE_URL")
If you want to define a default/fallback value for the environment variable when it's not set, simply add it as the second argument:
DATABASE_URL = Envar.get("DATABASE_URL", "postgres://uname:pass@host:5432/dbname"")
If you need to check that a variable is set,
use is_set?/1
if Envar.is_set?("Heroku") do
# do stuff on Heroku
end
To check if any of the variables in a List
are set,
invoke Envar.is_set_any?/1
:
if Envar.is_set_any?(~w/HEROKU FLYIO/) do
# Do something on non-prod environment
end
Conversely, to confirm that all the environment variables
in a list are set, invoke Envar.is_set_all?/1
:
if Envar.is_set_all?(~w/ADMIN_EMAIL AUTH_API_KEY/) do
# Do something with the required environment variables
end
We needed a couple more convenience functions, so we wrote them!
If you need to read an .env
file and get the
keys & values as a Map
, invoke Envar.read/1
:
iex> Envar.read(".env")
%{
"ADMIN_EMAIL" => "alex@gmail.com",
"EVERYTHING" => "awesome!",
"SECRET" => "master plan"
}
If you need just the keys
of the list of environment variables in an .env
file,
invoke: Envar.keys/1
:
iex> Envar.keys(".env")
["ADMIN_EMAIL", "EVERYTHING", "SECRET"]
And if you need just the values
of the environment variables in an .env
file,
invoke: Envar.values/1
:
iex> Envar.values(".env")
["alex@gmail.com", "awesome!", "master plan"]
For more detail, please see docs: https://hexdocs.pm/envar/Envar.html#functions
Happy Elixir
Coding! 🚀
We created this module after doing
a search of the Elixir
(Hex.pm)
ecosystem,
see:
dwyl/learn-environment-variables/issues/18
There are several modules available,
we wanted something very basic/specific to our needs.
We don't expect anyone else to use this;
it's Open Source
because that's just what we do:
/manifesto.md#open-source-always