Duplicated modules error from running mix release

This error was a surprise from our Docker build. We have two different API client libraries that both have a mix task with the same module name (e.g. mix token to generate an access token for testing).

#34 [builder 19/19] RUN mix release myapp
#34 2.309 ** (Mix) Duplicated modules: 
#34 2.309     'Elixir.Mix.Tasks.Token' specified in library1 and library2
#34 ERROR: process "/bin/sh -c mix release myapp" did not complete successfully: exit code: 1

On the one hand, it seems like we should be able to avoid this entirely, since Mix doesn’t run in production, so there’s little point in copying these over into the release. But of course we need Mix to run mix release so I’m not sure the best way to do that.

On the other hand, it’s a little strange to me that this is an error at release time, but the compiler doesn’t mind, so we didn’t catch it earlier in our CI process. That would’ve been nice.

It looks like these mix tasks are available from the main app in development (well, one of them), so it does make sense for me to rename one or put them down in a module named after the library. That further suggests that this issue should at least be a warning from mix compile --warnings-as-errors.

I’m guessing your CI is not catching this since --warnings-as-errors doesn’t catch warnings coming from dependencies. I was having trouble finding documentation that spells this out but here is the PR.

I otherwise think that it’s good practice to keep mix tasks under some private namespace, just as we’re generally encouraged to namespace our apps, event though they don’t end up in the final release.