I’m trying to import a helper module in my application that is only available in under :dev
and :test
mix environments.
I’ve got the following in my mix.exs
to prevent the helper module from being compiled under :prod
:
defp elixirc_paths(:test), do: ["lib", "test/fixtures", "test/support"]
defp elixirc_paths(:dev), do: ["lib", "test/fixtures"]
defp elixirc_paths(_), do: ["lib"]
and then the following in the body of one of my modules:
def MyAppWeb.ProxyController do
...
# Insert controller actions to serve fixture data in development and testing
if Mix.env() in [:dev, :test] do
import MyApp.Fixtures, only: [mock_proxy: 1]
mock_proxy(:the_thing)
end
...
end
The mock_proxy/1
macro injects some function clauses to the module. This works great under :dev
or :test
environments, but fails in :prod
with the following error?
== Compilation error in file lib/my_app_web/controllers/proxy_controller.ex ==
** (CompileError) lib/my_app_web/controllers/proxy_controller.ex:18: module MyApp.Fixtures is not loaded and could not be found
(stdlib 3.14.2) lists.erl:1358: :lists.mapfoldl/3
(stdlib 3.14.2) lists.erl:1359: :lists.mapfoldl/3
(elixir 1.12.1) expanding macro: Kernel.if/2
I thought this wouldn’t happen because of the if statement at the module level, but clearly something else is going on. I can “fix” this by compiling this path in all environments, but I’d like to avoid that if I can.
Any thoughts on what I’m missing here?