defmodule KayaanPrints.EnvLoader do
def load_env(path \\ ".env") do
if File.exists?(path) do
File.stream!(path)
|> Stream.map(&String.trim/1)
|> Enum.each(fn line ->
[key, value] = String.split(line, "=")
System.put_env(key, value)
end)
end
end
end
So, I’m using the above module to load env variables into System. And in my config file, I have added the below code:
if config_env() in [:dev, :test] do
Code.eval_file("lib/kayaan_prints/env_loader.ex")
KayaanPrints.EnvLoader.load_env()
end
It doesn’t throw any error but it shows this as a problem: redefining module KayaanPrints.EnvLoader (current version defined in memory)
I think it is due to Code.eval_file which loads and evaluates the file everytime it recompiles. Importing module doesn’t work as well. How do i resolve this? if I don’t want to write the whole module code in config.exs file, is there any way i can somehow import it into config?
I respect doing things manually but there’s already an established way to do what you want - dotenvy. If you’re not working on a personal project I encourage you to give the library a try.
Edit: If you still what to go with a homegrown solution, check the built-in Config.Provider.
Thanks a lot sir. But the dotenvy only works during runtime, what if i wanted to load environment variables during compile time without manual code. Are there any libraries available for the same?
if not function_exported?(KayaanPrints.EnvLoader, :__info__, 1) do
Code.eval_file("lib/kayaan_prints/env_loader.ex")
end
KayaanPrints.EnvLoader.load_env()