astral-sh / uv

An extremely fast Python package and project manager, written in Rust.
https://docs.astral.sh/uv
Apache License 2.0
24.24k stars 702 forks source link

Let dependency-group members share a dependency source #8577

Open ealap opened 4 hours ago

ealap commented 4 hours ago

I have just read the recent release that added supported for PEP-735 and immediately went on to try it on my project. So far I have something like this:

[dependency-groups]
groupA = [
  "pytest",
  "ruff"
]
groupB = [
  "cool-stuff-1",
  "cool-stuff-2",
  "cool-stuff-3",
  "cool-stuff-4",
  "cool-stuff-5",
  "cool-stuff-6",
  "cool-stuff-7",
  "cool-stuff-8",
  "cool-stuff-9",
  "cool-stuff-10"
]
groupMACOS = [
  "apple-stuff-1",
  "apple-stuff-2",
  "apple-stuff-3"
]

[tool.uv.sources]
pytest = { index = "groupA" }
cool-stuff-1 = { index = "groupB" }
cool-stuff-2 = { index = "groupB" }
cool-stuff-3 = { index = "groupB" }
cool-stuff-4 = { index = "groupB" }
cool-stuff-5 = { index = "groupB" }
cool-stuff-6 = { index = "groupB" }
cool-stuff-7 = { index = "groupB" }
cool-stuff-8 = { index = "groupB" }
cool-stuff-9 = { index = "groupB" }
cool-stuff-10 = { index = "groupB" }
apple-stuff-1 = { index = "groupA", marker = "sys_platform == 'darwin'" }
apple-stuff-2 = { index = "groupA", marker = "sys_platform == 'darwin'" }
apple-stuff-3 = { index = "groupA", marker = "sys_platform == 'darwin'" }

[[tool.uv.index]]
name = "groupA"
url = "https://download.mypypi.org/whl/group/A"

[[tool.uv.index]]
name = "groupB"
url = "https://download.mypypi.org/whl/group/B"

As you can see, it's easy to make a wall of similar text when you need specific sources and specifiers for a couple or more dependencies. But most are just sharing the same 2 unique values: { index = "groupB" }, { index = "groupA", marker = "sys_platform == 'darwin'" }

To simplify this, it seems that next improvement is to have a group share a sources setting.

[dependency-groups]
groupA = [
  "pytest",
  "ruff"
]
groupB = [
  "cool-stuff-1",
  "cool-stuff-2",
  "cool-stuff-3",
  "cool-stuff-4",
  "cool-stuff-5",
  "cool-stuff-6",
  "cool-stuff-7",
  "cool-stuff-8",
  "cool-stuff-9",
  "cool-stuff-10"
]
groupMACOS = [
  "apple-stuff-1",
  "apple-stuff-2",
  "apple-stuff-3"
]

[tool.uv.sources]
pytest = { index = "groupA" }
groupB = { index = "groupB" }
groupMACOS = { index = "groupA", marker = "sys_platform == 'darwin'" }

[[tool.uv.index]]
name = "groupA"
url = "https://download.mypypi.org/whl/group/A"

[[tool.uv.index]]
name = "groupB"
url = "https://download.mypypi.org/whl/group/B"
zanieb commented 4 hours ago

I believe this is pretty similar to https://github.com/astral-sh/uv/issues/8415

We could provide a way to define sources for entire group.