Hi everyone,

I have an umbrella project with 2 apps: first, `ledger`, is using Ecto and 
the 2nd, `money`, one is mostly just a struct with some functions.

Now, the 2nd app has an "optional" Ecto support, it defines a custom 
Ecto.Type for that struct. The Ecto support is wrapped in a `if 
Code.ensure_loaded?(Ecto.Type)` because I didn't want to specify Ecto as a 
dependency.
See: 
https://github.com/wojtekmach/umbrella_bug/blob/3dca063ee4bb3f4cc020708c218e31c13d2ad4a6/apps/money/lib/money/ecto.ex#L1.

When I run the tests from the root of the app everything works well.
Now, when I `cd apps/money && touch && lib/money/ecto.ex && mix test` that 
works too. But when I then re-compile from within the 1st app: `cd 
apps/ledger && mix test` my custom types isn't defined. Which makes sense, 
because when I compiled the 2nd app, `Ecto.Type` wasn't available at that 
time and some the generated .beam does not have that.

My temporary solution is to just recompile stuff from the root. Another 
solution is to introduce `apps/ledger/lib/money_ext.ex` and define the 
extension there - the downside is that I'd rather keep that stuff in the 
`money` app.
Finally, I could just make `money` depend on Ecto directly, but I'm 
wondering if there's another way. If I'd ever publish the package on Hex I 
wouldn't want to depend on `ecto` directly (make that optional instead) and 
so I'd likely end up with the similar `if Code.ensure_loaded` guard.

All code is on 
github: 
https://github.com/wojtekmach/umbrella_bug/tree/3dca063ee4bb3f4cc020708c218e31c13d2ad4a6

Thanks,
Wojtek

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-talk/06404fb8-363c-4942-af28-a96e1b2d62f9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to