juftin / hatch-pip-compile

hatch plugin to use pip-compile (or uv) to manage project dependencies and lockfiles
http://juftin.com/hatch-pip-compile/
MIT License
76 stars 3 forks source link

matrix environments with parent environment with different python version raise an error #37

Open juftin opened 10 months ago

juftin commented 10 months ago

This can be problematic in CI/CD where you run hatch run +py={{ matrix.python }} matrix:cov and have hatch.python set to a differing version than your current matrix version

[tool.hatch.envs.default]
pip-compile-constraint = "default"
type = "pip-compile"
python = "3.11"

[tool.hatch.envs.test]
dependencies = [
  "pytest",
  "pytest-cov"
]

[tool.hatch.envs.test.scripts]
cov = [
  "pytest --cov-config=pyproject.toml --cov {args:tests}"
]

[tool.hatch.envs.matrix]
template = "test"

[[tool.hatch.envs.matrix.matrix]]
python = ["3.8", "3.9", "3.10", "3.11", "3.12"]

In the above example you must have the 3.11 environment available to use pip-compile environments from a matrix because default is a constraint environment

AttributeError: 'NoneType' object has no attribute 'executable'

https://github.com/juftin/hatch-pip-compile/actions/runs/7117731072/job/19379122673?pr=28

See how this is handled here: https://github.com/juftin/hatch-pip-compile/blob/238fd44410ece0b53f5f2eb059ae85406a3aba45/.github/workflows/tests.yaml#L41-L49

IMO this isn't a bug - but this should probably be documented

juftin commented 10 months ago

The way that it's handled in this repo means we generate a lockfile for each Python version - if you wanted one lockfile for all python versions you could handle it like this and forget the hatch matrix entirely:

[tool.hatch.envs.default]
type = "pip-compile"
python = "3.11"

[tool.hatch.envs.test]
template = "test"
dependencies = [
  "pytest",
  "pytest-cov"
]
type = "pip-compile"
pip-compile-constraint = "default"

[tool.hatch.envs.test.scripts]
cov = [
  "pytest --cov-config=pyproject.toml --cov {args:tests}"
]