beardedeagle

beardedeagle

Declare an OTP application as a dependency without putting it in application/0?

I have a library I’ve owned for some time, beardedeagle/mnesiac, and over the last few years I’ve noticed several people forking the repo to remove :mnesia from application/0. I figured, if it’s happened more than a couple times, I’d take a look into it and see if that’s something I should change in the library proper.

So, digging into it, I see two potential reasons for why people are doing this:

That last point really resonates with me, as I want consumers to have complete control around the specifics around mnesia start/ownership. I put mnesia into included_applications in an attempt to ensure it was loaded, but not started by my library. However, if I remove mnesia from application/0 in my mix.exs, my test suite will understandably start throwing warnings like the following:

warning: :mnesia.add_table_copy/3 defined in application :mnesia is used by the current application but the current application does not depend on :mnesia. To fix this, you must do one of:

  1. If :mnesia is part of Erlang/Elixir, you must include it under :extra_applications inside “def application” in your mix.exs

  2. If :mnesia is a dependency, make sure it is listed under “def deps” in your mix.exs

  3. In case you don’t want to add a requirement to :mnesia, you may optionally skip this warning by adding [xref: [exclude: [:mnesia]]] to your “def project” in mix.exs

So now I’m trying to figure out the best way to handle this. Here is my understanding of things so far:

  • Keeping mnesia in included_applications doesn’t start mnesia, but the mnesia process itself would be owned by mnesiac as far as I can tell, which I don’t want. Also, this violates the first point above. So, this is out.
  • Putting mnesia into extra_applications with :optional won’t work for what I’m trying to do as the only thing that does is ensure that my library startup won’t be impacted in the event that mnesia isn’t available to start. Also, the goal here is to make it so my library doesn’t start mnesia which as far as I can tell extra_applications will do, so this is out.
  • I could xref: [exclude: [:mnesia]]. I’m not particularly a fan of this as to me, it makes it seem like the library doesn’t need mnesia when it clearly does.

I am unsure there is a better way to handle this than excluding it from xref though. I’m also unsure if doing this via the xref method would have any other potential pitfalls I’m not considering. Any suggestions, pointers or docs would be greatly appreciated here. Thank you in advance.

Most Liked

christhekeele

christhekeele

Would making your application/0 conditional on Mix.env() so that:mnesia is only included for development/testing purposes, but not “prod” package publishing purposes, work? Ex. this example

tristan

tristan

Rebar3 Core Team

Another option may be to keep it in applications but the user setting mnsia to load in their release so they can start it where ever they want.

Last Post!

beardedeagle

beardedeagle

Yeah, that’s a possibility. Basically, move mnesia to extra_applications and explicitly document how to utilize load with mnesiac.

Where Next?

Popular in Questions Top

hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New

Other popular topics Top

baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement