[DEV]: add pixi.lock and add pixi to pyproject.toml#31384
[DEV]: add pixi.lock and add pixi to pyproject.toml#31384jklymak wants to merge 2 commits intomatplotlib:mainfrom
Conversation
|
.. I'm surprised the tests are running given I labelled this [ci doc] |
tools/pixi.toml
Outdated
| depends-on = ["clean-build", "dev-install"] | ||
| description = "Clean and rebuild editable install" | ||
|
|
||
| [tasks.install-test] |
There was a problem hiding this comment.
We should make features for tests + docs.
There was a problem hiding this comment.
Yes we could do it that way, but I'm not sure of the pros and cons. It did not seem there was a way to make conditional install dependencies so I wasn't sure the advantage of having separate feature envs for a developer versus just having one env.
tools/pixi.toml
Outdated
| description = "No-op on non-mac platforms" | ||
|
|
||
| [target.osx-arm64.tasks.prepare-freetype] | ||
| cmd = "cp subprojects/packagefiles/freetype-2.6.1-meson/src/gzip/zconf.h subprojects/freetype-2.6.1/src/gzip" |
There was a problem hiding this comment.
I also don't understand this, is something going wrong with unpacking the subproject? This seems like something we should be fixing in the meson files rather than here?
There was a problem hiding this comment.
I don't think it's a general problem, but it's definitely a problem on macOS with the version of zconf
There was a problem hiding this comment.
OK< I think this was not necessary, as it now works fine without it.
|
It is my understanding that if you have metadata about the build you are (or will soon be able) to point to a repo as a conda dependency and pixi-build will build the conda-package on the fly (the same way it does with pypi-deps). Given that we are going to want That said, I agree we do not want to check in the |
|
I mean add a section like |
|
Ah I see. No that didn't work as I don't think it's compatible with build isolation. |
|
OK< my comment above was incorrect. The new pixi.toml has removed the font copying things, and uses which indeed seems to be fine. Still not sure if we should run with features or just a separate install steps? |
7d73c47 to
27d86a1
Compare
aedf224 to
055029d
Compare
055029d to
85257fe
Compare
a0a2ff5 to
c0467de
Compare
c0467de to
f3e0de0
Compare
a40ae3f to
3ba6a65
Compare
3ba6a65 to
313bf08
Compare
|
Note: Mypy errors are based on a new mypy release yesterday, which improves type narrowing. https://mypy.readthedocs.io/en/stable/changelog.html Unrelated to here, but needs investigation. |
|
Built docs are here: https://output.circle-artifacts.com/output/job/2a1cb0cd-b9e6-487d-8213-ccadbf52b0b5/artifacts/0/doc/build/html/devel/development_setup.html Not sure about the Note... Tip... Note... I think I'll move the pyproject.toml note up to be a warning as we really don't want people to edit that unless absolutely necessary. EDIT: combined the two tips, and made the note about pyproject.toml a warning. |
7b7c719 to
0ce998c
Compare
|
Do we need the warning at all? / Do we need the warning here? This is about dev environment setup. Somebody setting up is not likely to mess with existing configuration. We also don’t warn on the other environment setups. |
I guess I'm not sure, partially out of ignorance for how others work. The central tension here is between what a casual developer wants, which is a pixi.toml that they may want to edit, versus what we want for CI which is to check and create the canonical If someone can't get However, I'm very open to the idea that the way I've suggested we resolve this tension here is not the best one. You could imagine the CI-verified pixi.lock goes somewhere more discrete than the top level, and the burden to update it belongs to experienced developers who change the project requirements. That would be a bit of reorganization here, but may be cleaner. |
|
My primary question would be: Isn’t the config we provide here good enough for the average developer? There could be expert use cases, but I’d trust that experts know enough to not mess up. I would only discuss a custom pixi.toml if that is a typical use case: And then its usage should be explicitly explained somewhere around here. Also, we have the PR review, so that we will catch improper updates. Overall, I’d leave this out and only add the warning, if improper updates become reasonably common. |
|
Note: I did a pixi setup yesterday on a fresh machine, and it went quite smooth with the preconfigured settings. Running tests is possible. Doc build is a bit fiddly because Sphinx crashes with awkward messages if the “external” dependencies Ghostscript and Latex are not available. That’s not a direct issue of pixi, but we could consider including the Ghostscript conda package (in a follow up PR). |
I think so, and it's encouraging that it works on at least three machines (mine, yours, and CI) The goal with the warning was just to alert folks not to edit pyproject.toml. However, happy to remove that section and add it back if it becomes problematic. |
965359f to
24087b2
Compare
timhoffm
left a comment
There was a problem hiding this comment.
Optional wording improvements.
doc/devel/development_setup.rst
Outdated
|
|
||
| A pixi configuration is included in ``pyproject.toml``. The environment | ||
| includes the base Matplotlib dependencies, and documentation and testing | ||
| dependencies. To install the dependencies:: |
There was a problem hiding this comment.
Optional: Some duplication with the paragraph before the tab group:
We recommend using one of the following options for a dedicated development environment because these options are configured to install the Python dependencies as part of their setup.
Maybe shorten the paragraph before to (or similar)
We recommend using one of the following options for a dedicated development environment because they contain the development dependencies.
And then leave out the sentence here ("The environment ... testing dependencies").
There was a problem hiding this comment.
I think I simplified this to reduce the redundancy - the point was that the pixi install does all the dependencies (beyond the really big doc ones), not that it installs the base dependencies.
There was a problem hiding this comment.
But pip install —group dev and the environment.yaml do that as well, AFAICS. So there‘s nothing special about pixi.
There was a problem hiding this comment.
OK, so changed to
A `pixi`_ configuration is included in ``pyproject.toml`` that will
install the development dependencies::
| includes the base Matplotlib dependencies, and documentation and testing | ||
| dependencies. To install the dependencies:: | ||
|
|
||
| pixi install |
There was a problem hiding this comment.
Do we need a dedicated pixi install? I assume pixi run would install the needed dependencies automatically? So we could simplify.
There was a problem hiding this comment.
I suppose we could just have the one command, but I like keeping them separate so the user knows it was the pixi part that failed, not the pip install part. When these things fail they are pretty opaque...
There was a problem hiding this comment.
Fair. OTOH the pixi install failing is quite unlikely. That‘d mean either an issue in the package infrastructure like a failing server) which is beyond our responsibility and should be rare) or it’s a configuration issue on our side. In the latter case we‘d also notice soon as this would also be broken in CI.
I leave this up to you.
There was a problem hiding this comment.
I'm more thinking it may fail on machines we don't test...
24087b2 to
63bbd36
Compare
…ci doc] Apply suggestions from code review Co-authored-by: Tim Hoffmann <[email protected]>
63bbd36 to
093c210
Compare
Edit: apologies for the CI churn --- I needed to iterate on the Pixi workflow to get it working end-to-end.
Overview
This PR adds Pixi configuration to
pyproject.tomland introduces a committedpixi.lock.The main goal is to provide a project-committed, pinned dependency snapshot for Matplotlib, addressing #23548. In particular:
pyproject.tomldefines the Pixi environment under[tool.pixi]pixi.lockrecords the fully resolved dependency setWhy
pyproject.tomlPixi configuration is placed in
pyproject.tomlrather than a project-levelpixi.toml.The reasoning is:
pyproject.tomlis already the canonical project configurationpixi.toml, which Pixi will prefer overpyproject.tomlThis gives the project a canonical shared configuration while still allowing personal overrides.
Lockfile policy
A main goal of this PR is to commit a pinned dependency list, and
pixi.lockis the mechanism used for that.pixi.lockshould therefore be treated as part of the repository state:pixi.lockIn that sense,
pixi.lockis the committed pinned dependency snapshot for the project.Developer workflow
Basic usage:
After that, for example:
Dependency changes:
If dependencies change, then
pixi.lockshould be regenerated. It is ignored by default in.gitignoreso developers who want to changepixi.lockwill need to regenerate it, and force add it to a commit:tools/pixi.example.tomlA template is provided for developers who want to customize their local Pixi setup.
For example:
This is intended for local experimentation or system-specific tuning. It is not the project's canonical Pixi configuration.
Key design decisions
Editable install is not managed directly by Pixi
This PR intentionally does not use:
In testing, that led to lockfile instability (
lock-file not up-to-date with the workspace), especially in CI.Instead, responsibilities are split:
pip install -e .installs Matplotlib itselfThis keeps
pixi.lockstable while still supporting editable development installs.Single environment
Although Pixi supports separate environments such as
testanddoc, this PR currently uses a single environment containing the relevant dependencies.The main reason is developer convenience:
This can be revisited later if stricter separation is desirable.
CI
This PR adds a minimal CI job that checks that the Pixi environment can be recreated from the committed lockfile.
At the moment the job is intentionally lightweight: it verifies that the lockfile works and that Matplotlib can be built/imported in that environment. It can be extended later to run tests and/or documentation builds.
Notes / future work
pixi.tomloverrides
AI disclosure
I went back and forth w/ chatGPT quite a bot on how to organize this and the various tradeoffs. It also helped with writing this summary, which is of course long-winded, but hopefully complete.