omegacen / conda-depgraph

A command-line utility to plot the dependency graph of a Conda environment.
GNU Lesser General Public License v3.0
52 stars 5 forks source link

Break the cycle between python and pip #5

Closed stuarteberg closed 4 years ago

stuarteberg commented 4 years ago

Long ago, the conda team decided to introduce an artificial dependency between python and pip, to ensure that no users ever install python without also installing pip. That means that the dependency graph for every python package now contains a cycle: python <--> pip.

That cycle introduces noise in the conda depgraph output for any python package. I think it's better for most users if that dependency is simply removed from the graph before visualizing it.

For example, here is the output for conda depgraph out click with and without the cycle.

click dependencies (without pip) ``` ┌─────┐ │click│ └──┬──┘ │ v ┌─────────────────┐ │ python │ └┬┬┬─────┬──┬─┬─┬┬┘ │││ │ │ │ ││ │││ │ │ │ │└──────┐ ┌─────┼┘│ │ │ │ │ │ │ │ │ │ │ │ │ │ v │ │ │ │ │ │ │ ┌──────┐ │ │ │ │ │ │ │ │sqlite│ │ │ │ │ │ │ │ └─┬──┬─┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┐│ │ │ │ │ └────┐ │ │ ┌────┼┘ │ │ │ │ │ │ │ │ v v │ │ │ │ │ │ │ ┌────────┐ │ │ │ │ │ │ │ │readline│ │ │ │ │ │ │ │ └────┬───┘ │ │ │ │ │ │ └────┐ │┌─────┘ │ │ │ │ │ │ ││ ┌─────┘ │ └──┼────┐ │ ┌───┼─┘│ │ │ │ │ │ │ │ │ │ │ │ │ v v │ │ v v v │ ┌───────┐ │ │┌───┐ ┌───────┐ ┌──────┐ │ │ncurses│ │ ││tk │ │openssl│ │libffi│ │ └───┬───┘ │ │└─┬─┘ └───┬───┘ └───┬──┘ │ │ │ │ │ │ │ │ │ │ │ │ └───────┐ │ │ └─────┼──┼──┼┐ │ │ │ ┌───────┼──┘ ││ │ │ │ │ │┌────┘│ │ │ │ │ ││ │┌─────────────┼─┘ │ │ ││ ││ ┌───────────┼──────┘ │ ││ ││ │ │ v vv vv v v ┌───┐ ┌─────┐ ┌───────┐ ┌───────────────┐ │xz │ │zlib │ │libcxx │ │ca-certificates│ └───┘ └─────┘ └───────┘ └───────────────┘ ```
click dependencies (with pip) ``` ┌─────────┐ │ pip │ └─┬─────┬┬┘ │^ ││ ┌────────┘│ ┌┘│ │ │ │ │ v │ │ │ ┌─────┐ │ │ │ │wheel│ │ │ │ └─┬─┬─┘ │ │ │ │ │ │ │ │ │ └───┐ │ │ │ │ │ └───┼─┼┐ │ │ ┌────┼─┘│ │ │ │ ┌┼──┘ │ v v ││ │ ┌──────────┐││ │ │setuptools│││ │ └───┬──┬───┘││ │ │ │ ││ └─────┼─┐└───┐││ ┌───┘ │ │││ │ │ │││ v │ │││ ┌───────┐ │ │││ ┌─────┐ │certifi│ │ │││ │click│ └───┬───┘ │ │││ └──┬──┘ │ │ │││ │ │ │ ││└┐ │ └─────┼─┐ ││ │ │ │ │ ││ │ │ v v v│ v v ┌─────────┴───────┐ │ python │ └┬┬┬─────┬──┬─┬─┬┬┘ │││ │ │ │ ││ │││ │ │ │ │└──────┐ ┌─────┼┘│ │ │ │ │ │ │ │ │ │ │ │ │ │ v │ │ │ │ │ │ │ ┌──────┐ │ │ │ │ │ │ │ │sqlite│ │ │ │ │ │ │ │ └─┬──┬─┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┐│ │ │ │ │ └────┐ │ │ ┌────┼┘ │ │ │ │ │ │ │ │ v v │ │ │ │ │ │ │ ┌────────┐ │ │ │ │ │ │ │ │readline│ │ │ │ │ │ │ │ └────┬───┘ │ │ │ │ │ │ └────┐ │┌─────┘ │ │ │ │ │ │ ││ ┌─────┘ │ └──┼────┐ │ ┌───┼─┘│ │ │ │ │ │ │ │ │ │ │ │ │ v v │ │ v v v │ ┌───────┐ │ │┌───┐ ┌───────┐ ┌──────┐ │ │ncurses│ │ ││tk │ │openssl│ │libffi│ │ └───┬───┘ │ │└─┬─┘ └───┬───┘ └───┬──┘ │ │ │ │ │ │ │ │ │ │ │ │ └───────┐ │ │ └─────┼──┼──┼┐ │ │ │ ┌───────┼──┘ ││ │ │ │ │ │┌────┘│ │ │ │ │ ││ │┌─────────────┼─┘ │ │ ││ ││ ┌───────────┼──────┘ │ ││ ││ │ │ v vv vv v v ┌───┐ ┌─────┐ ┌───────┐ ┌───────────────┐ │xz │ │zlib │ │libcxx │ │ca-certificates│ └───┘ └─────┘ └───────┘ └───────────────┘ ```

FWIW, the python/pip cycle created problems for conda-build, so even conda itself has special handling of this dependency in at least one place. (I wrote it.)

teake commented 4 years ago

LGTM. I've always wondered why that circular dependency was there :). Thanks!

stuarteberg commented 4 years ago

BTW, the pip dependency is not written into the recipe's metadata. It is artificially added by conda itself, and can be disabled via a config setting in your .condarc file:

https://docs.conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#add-pip-python-dependency