It would be useful to have a `mix deps.why` or `mix hex.why` task similar to `yarn why <package>` or `pnpm why <package>`, because I’m trying to figure out why `mix deps.get` is retrieving `poison`, when it is not in any of my `mix.exs` files (I am using an umbrella application).
```console
$ ag :poison $(fd mix.exs)
```
Yet it is in my `mix.lock`:
```console
$ ag '"poison":' mix.lock -c
1
$ mix deps.unlock poison
Unlocked deps:
* poison
$ ag '"poison":' mix.lock -c
$ mix deps.get
Resolving Hex dependencies...
Resolution completed in 0.67s
Unchanged:
[lots of entries]
New:
poison 5.0.0
$ ag '"poison":' mix.lock -c
1
```
Poison is otherwise mentioned in my `mix.lock`, but *only* because it is an optional dependency for other dependencies:
```
$ ag poison mix.lock
mix.lock
7: "app_identity": {:hex, :app_identity, "1.3.1", "6bf4970a433d7504a091b9ea57e6af4d7d23db76e7cc1577a6680e05823be7b2", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}, {:poison, ">= 3.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}, {:tesla, "~> 1.0", [hex: :tesla, repo: "hexpm", optional: true]}], "hexpm", "70b92d03fdf1140e26a71bad5c042d9474686999457deecaad7b30f0a794b918"},
45: "gen_queue_opq": {:git, "
https://github.com/KineticCafe/gen_queue_opq.git", "a0552879e3e17441c33e52e8688981b5c34f0375", [branch: "allow-poison-5"]},
77: "poison": {:hex, :poison, "5.0.0", "d2b54589ab4157bbb82ec2050757779bfed724463a544b6e20d79855a9e43b24", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "11dc6117c501b80c62a7594f941d043982a1bd05a1184280c0d9166eb4d8d3fc"},
87: "tesla": {:hex, :tesla, "1.7.0", "a62dda2f80d4f8a925eb7b8c5b78c461e0eb996672719fe1a63b26321a5f8b4e", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "2e64f01ebfdb026209b47bc651a0e65203fcff4ae79c11efb73c4852b00dc313"},
```
In short, I don’t know why `poison` is being added back, and it would be nice if there was an equivalent to `pnpm why <dependency>`. I don’t know enough about how dependency resolution currently works to work on a PR, but I think that this would be of value.
-a
--