Examples

In this section you can find different scenarios of various complexity, which shows how to utilize features of ConfigEnv.jl.

Simple ENV manipulations

If the package that you are using provides support for environmental variables, than all you have to do is write proper .env and populate ENV with dotenv function.

For example, here is how one can setup and use Telegram.jl functions

Configure .env

# .env
TELEGRAM_BOT_TOKEN = <YOUR TELEGRAM BOT TOKEN>
TELEGRAM_BOT_CHAT_ID = <YOUR TELEGRAM CHAT ID>

and use it in an application

using Telegram, Telegram.API
using ConfigEnv

dotenv()

sendMessage(text = "Hello, world!") # uses TELEGRAM_BOT_TOKEN and TELEGRAM_BOT_CHAT_ID

Multifile configuration

One can use merge feature to factor out repeating parts of environment configuration. For example, one can use the following file file structure

/
  .root_env
  dir1/
    .env
    file1.jl
  dir2/
    .env
    file2.jl

In this case .root_env can contain

HOST = localhost
PORT = 1234

and .env in dir1 can be

USER = FOO
PASSWORD = BAR

Then file1.jl can use the following construction

using ConfigEnv

dotenv(".env", "../.root_env")

As a result, all four variables are set in the environment. By using different user/password in .env of dir2 one can obtain directory dependent environments without repeating HOST and PORT values.

Templating configuration

Expanding on the previous example, imagine that you have different user/password pairs for production and testing environments. Than you can organise your .env files as follows

# .root_env
USER_PRODUCTION = FOO
USER_TEST = TEST

PASSWORD_PRODUCTION = BAR
PASSWORD_TEST = 123

USER = ${USER_${ENVIR}}
PASSWORD = ${PASSWORD_${ENVIR}}
# dir1/.env
ENVIR = PRODUCTION

Then in your file1.jl you can get the following

using ConfigEnv

dotenv("../.root_env", ".env")

ENV["USER"]     # FOO
ENV["PASSWORD"] # BAR

So variables USER and PASWORD will be set according to the value of ENVIR.

Using IO objects

One can even go further and use templates together with IO objects to dynamically update application configuration. For example, if application looks like

/
  .env
  app.jl

with .env similar to the previous example

USER_PRODUCTION = FOO
USER_TEST = TEST

PASSWORD_PRODUCTION = BAR
PASSWORD_TEST = 123

USER = ${USER_${ENVIR}}
PASSWORD = ${PASSWORD_${ENVIR}}

and there is a .env

ENVIR = PRODUCTION

located on some server in local network, then one can use the following construction in app.jl

using ConfigEnv
using HTTP

dotenv(IOBuffer(HTTP.get("http://127.0.0.1/.env").body), ".env")

ENV["USER"]     # FOO
ENV["PASSWORD"] # BAR

So it is possible to change application mode from production to test, just by changing value of the .env file on server.