Calling my own app's functions from `dev.exs`?

I have a mix app, and the following snippet in runtime.exs:

if config_env() == :prod do
  # ...
  phx_ip = case System.get_env("PHX_IP", "ANY") do
    "ANY" -> :any
    s -> case MyApp.Util.parse_ip(s) do
      {:ok, ip} -> ip
      {:error, error} -> :erlang.error(error)
    end
  end

However, when I try to port this snippet to dev.exs (we need to test the specific-IP handling code in dev), it won’t compile because MyApp.Util isn’t available.

How should I make a module of my code available to dev.exs?

This is not an answer to your question, but it’s perfectly fine to gate code by env in runtime.exs; this is in fact exactly what the if config_env() == :prod do line in your snippet does.

(You are probably aware of this, but I mention it just in case.)

2 Likes

This may be similar to this thread,

But based on some quick testing I’d say you don’t really want to do what you’re doing inside a dev.exs. It’s only run before compile (which is why you can’t read your modules’ functions) and is not run after you’ve built your release. In your case it looks like you’re reading an env var to determine which IPs to bind to, which is definitely something you’d want to do on each startup.

However, when I try to port this snippet to dev.exs (we need to test the specific-IP handling code in dev), it won’t compile because MyApp.Util isn’t available.

Could you just remove the if config_env() == :prod around your phx_ip code to test in dev?

4 Likes

Any code that needs to be tested should be in a module, not in a config file.

You cannot use functions defined in your code in dev.exs as there you define compile-time config. So you will have chicken-egg problem if that would be possible.

2 Likes