Namit
Redifining module problem because of Code.eval_file in config.exs
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?
Marked As Solved
lud
Something like this may suppress the warning:
if not function_exported?(KayaanPrints.EnvLoader, :__info__, 1) do
Code.eval_file("lib/kayaan_prints/env_loader.ex")
end
KayaanPrints.EnvLoader.load_env()
Also Liked
mudasobwa
Instead of Code.eval_file/1 one should use compile_path: config in your Mix.Project file. More precisely, elixirc_paths: is your friend.
That said, in mix.exs you are to have
…
def project do
[
…
elixirc_paths: elixirc_paths(Mix.env()),
…
]
defp elixirc_paths(:test), do: ["lib", "extras"]
defp elixirc_paths(:dev), do: ["lib", "extras"]
defp elixirc_paths(_), do: ["lib"]
Then move your file from the main tree ("lib" dir) to "extras" on the same level as "lib".
And, finally, use that:
if Code.ensure_loaded?(KayaanPrints.EnvLoader),
do: KayaanPrints.EnvLoader.load_env()








