Dependencies have diverged: ex_doc

I have a problem that is coming up now and then. One app depends on another, which depends on another. This is all ok because the organization is good – no cyclic dependencies.

However, many times, I find that there is problem with ex_doc because all packages use this. But if one package includes it in a slightly different way, the app that depends on that package will get an error, something like:

Dependencies have diverged:
* ex_doc (Hex package)
  the :only option for dependency ex_doc

  > In mix.exs:
    {:ex_doc, "~> 0.24.0", [env: :prod, repo: "hexpm", hex: "ex_doc", only: :dev, runtime: false, optional: true]}

  does not match the :only option calculated for

  > In deps/unicode_set/mix.exs:
    {:ex_doc, "~> 0.19", [env: :prod, hex: "ex_doc", repo: "hexpm", optional: false]}

  Remove the :only restriction from your dep
** (Mix) Can't continue due to errors on dependencies

I am trying many things to fix this in the dependencies, but it seems that always the parent app has this problem. It’s very frustrating!

I am noticing how packages like ecto use ex_doc, and is something like {:ex_doc, "~> 0.20", only: :docs} (but this does not seem to solve the “Dependencies have diverged” problem).

How should packages include ex_docs? Pretty much everything on hex.pm requires this package to make it’s documentation pages, yes?

Dependencies always run in :prod env and :ex_doc is documented to be included as only: :dev (or custom equivalent). This should resolve the problem of ex_doc mismatches. Though it seems :unicode_set doesn’t exclude :ex_doc from :prod at the moment.

1 Like

And a PR has already been made and merged to fix that: Sets ex_doc and benchee to optional: true; bumps vers by fireproofsocks · Pull Request #3 · elixir-unicode/unicode_set · GitHub

Now you can either depend on the unicode_set master branch {:unicode_set, github: "elixir-unicode/unicode_set", branch: "master"} or wait for the next release.

Another fix would be to use override: true on ex_doc. I’m actually surprised that the error message doesn’t recommend that, unless it doesn’t allow overriding “only”.

1 Like

Thanks to @fireproofsocks and @vrod for the issue and PRs. I have merged and published:

Please reopen an issue if you spot anything else.

4 Likes

Quick question: why does it depend on ExDoc for prod? Shouldn’t it be a dev only dep?

Edit: it is dev only now. :slight_smile: then there is no need to be optional!

1 Like

Thank you for the explanations and the quick fixes!