Release Notes
✨ Highlights
This release adds a lot of exciting features.
⚠️ Breaking: Configurable Conda to PyPI name mappings
Pixi now gives you more control over how conda packages are matched to PyPI packages.
Previously you could already have an external map, in a file that overwrote the mappings we generate with parselmouth
There were a couple of problems though:
- It was alwys a full overwrite,
- We write a single-file compressed mapping, but it was not usable directly in Pixi and needed to be modified.
Especially 2, limited people on corporate networks to host their own mappings. We've now made a bunch of improvements:
Workspace conda-pypi-map now supports per-channel configuration with:
- inline mappings,
- remote mapping files, local was already supported,
- Direct support for linking to: https://github.com/prefix-dev/parselmouth/blob/main/files/compressed_mapping.json
- overlay (new) vs replacement (old) behavior,
- explicit opt-out for certain packages,
- and finally control over the same-name heuristic. Meaning that in case of a fallback you can enable just taking the conda as the PyPI name.
This makes it easier to fix individual name mismatches, use private channel mappings, or run reliably in
offline and firewall-restricted environments.
And with remote mapping files specifically, you could host an accurate mapping on your own infrastructure by using the compressed mapping, no need to hit an external network.
[workspace.conda-pypi-map]
# Fix a few names while falling back to Pixi's default mapping.
conda-forge = { mapping = { pytorch = "torch", not-on-pypi = false } }
# Treat a custom mapping as the source of truth for a channel.
my-company = { location = "mapping.json", mapping-mode = "replace" }
# Disable PyPI name derivation for one channel.
internal = falseThe Python build backend also gains pypi-conda-map, letting pixi-build-python override PyPI-to-conda
dependency mapping inline before consulting the mapping service:
[package.build.config]
ignore-pypi-mapping = false
pypi-conda-map = { torch = "pytorch", my-internal-pkg = false }All in all, this is a breaking change, since bare mapping locations such as conda-forge = "mapping.json" are now additive overlays by default.
To restore the old source-of-truth behavior, use:
conda-forge = { location = "mapping.json", mapping-mode = "replace", same-name-heuristic = false }conda-pypi-map = false now fully disables PyPI name derivation, including same-name guessing. The
legacy conda-pypi-map = {} behavior is still supported but deprecated; spell it explicitly as:
conda-pypi-map = { conda-forge = { mapping-mode = "replace" } }Rich platforms
We deprecated [system-requirements] in favor of the much more expressive rich platform support.
On top of operating systems and processor architecture, platforms can now also include system requirements like CUDA or glibc version:
[workspace]
platforms = [
"osx-arm64",
{ platform = "linux-64", cuda = "12.0", glibc = "2.28" },
{ name = "jetson-nano", platform = "linux-aarch64", cuda = "12.8" },
]Speaking of CUDA, together with rich platforms we added support for __cuda_arch.
We already supported __cuda which allows specifying the driver version you require.
With __cuda_arch, you can specify the necessary hardware architecture.
v3 Repodata
We also added support for v3 repodata.
That means you can declare extra dependency groups:
[package.extra-dependencies.test]
hypothesis = "*"
pytest = ">=8"
[package.extra-dependencies.cuda]
cupy = ">=13"And of course you can also consume them:
[dependencies]
mypackage = { path = "./mypackage", extras = ["test"] }It also includes the when keyword:
[package.run-dependencies]
unix-helper = { version = "*", when = "__unix" }And it allows to set flags:
[package.build]
backend = { name = "pixi-build-cmake", version = "0.*" }
# not required:
channels = ["https://prefix.dev/conda-forge"]
config = { key = "value" } # Optional configuration, specific to the build backend
flags = [
"cuda",
"blas_openblas",
] # Optional variant flags recorded in the package metadataNote that while the conda-forge channel does not support v3 repodata just yet. You can start using it for your local (pixi build) source built packages.
Conditional dependencies
Finally, we revamped the way we define conditional dependencies.
We deprecated [package.target.*.host,build,run-dependencies] and introduce the following syntax:
# Only needed when cross-compiling (host platform differs from build platform).
[package.build-dependencies."if(host_platform != build_platform)"]
cross-python = "*"
# Only on Linux.
[package.host-dependencies."if(host_platform == 'linux-64')"]
libgl-devel = ">=1.7.0,<2"
# Based on a build variant.
[package.host-dependencies."if(matches(python, '>=3.10'))"]
exceptiongroup = "*"NOTE: This only affects source dependencies, [target.*.dependencies] remains valid.
Breaking changes
Added
- Rich Platform support by @hunger in #6178
- Support extras, flags and when on conda dependencies by @Hofer-Julian in #6262
- Do not run tests un unsupported platforms by @hunger in #6339
- Support if(...) conditional package dependencies by @Hofer-Julian in #6269
- Support wildcard platform target selectors by @hunger in #6301
pixi addskips already-present packages without version spec by @ruben-arts in #6352- Make package.build.backend.version optional by @Hofer-Julian in #6384
- Add
--no-pypiflag to conda-environment export by @baszalmstra in #6380 - Derive
c_stdlibbuild variants from system requirements by @hunger in #6320 - Friendly __cuda_arch support by @hunger in #6408
Changed
- Make test_info_output_extended platform-agnostic by @Hofer-Julian in #6314
- Key locked records by declared platform for rich platforms by @hunger in #6315
- Detect extra-dependency drift for source packages by @Hofer-Julian in #6263
- Attest the tarballs and the binary inside separately by @hunger in #6266
- Allow to re-order, do not sort in the one place that persisted by @hunger in #6346
- Recommend 'pixi workspace platform add' in target help by @hunger in #6358
- Do not fail when asked to install an environment with an unused requirement not used by @hunger in #6389
- Resolve pre-v7 lockfiles for migrated platforms by @hunger
- Use rust integration tests. by @hunger in #6375
- Relock advanced_cpp doc example by @tdejager in #6403
- Forward declared __cuda_arch to the solver by @hunger in #6404
- Repair main CI failures by @tdejager in #6406
Documentation
- Remove pixi-inject page by @pavelzw in #6276
- Add a pixi-build v3 example using extras, flags and when by @Hofer-Julian in #6264
- Mention code execution of pixi-build in security section by @pavelzw in #6361
Fixed
- Move examples satisfiability tests to Python by @Hofer-Julian in #6300
- Honor workspace [cache.*] overrides for conda-pypi mapping cache by @baszalmstra in #6284
- Stop source builds rebuilding from scratch on every run by @baszalmstra in #6285
- Suggest the correct cache config key in netfs-redirect warning by @baszalmstra in #6282
- Skip example satisfiability checks on unsupported platforms by @tdejager in #6311
- Skip pytorch doc examples on platforms they don't support by @hunger in #6317
- Stop requiring old backend version doc example by @Hofer-Julian in #6338
- Allow OCI channels by @baszalmstra in #6341
- Move workspace variants build test under pixi_build by @hunger in #6345
- Detect site-packages clobbering of conda packages by PyPI wheels by @tdejager in #6344
- Refactor test for pixi workspaces by @ruben-arts in #6351
- Removing environment updates lockfile by @ruben-arts in #6337
- Derive used variants from conditional dependencies by @Hofer-Julian in #6354
- Resolve initialization manifest bugs and restructure the init module by @samrosenf in #6294
- Update stale detached environment and build symlinks by @kilian-hu in #6154
- Anchor [tool.uv.sources] paths to workspace root in pixi.lock by @jevandezande in #6187
- Stop adapting backend behaviour based on build/host dependencies by @Hofer-Julian in #6356
- Verify PyPI lock file hashes during install by @tdejager in #6353
- Set exclude-newer for
pixi-build-rustto0dby @Hofer-Julian in #6394 - Set macOS deployment target for PyPI source builds by @tdejager in #6396
- Install env in PyPI git add test by @tdejager in #6401
- Fix CI on main by @Hofer-Julian in #6402
- Abi3 run export handling for pixi-build-python by @pavelzw in #5751
- Refresh conda-meta/pixi marker when a platform changes by @hunger in #6366
- Pin boltons to 25.0.0 in purl hash-mapping test by @Hofer-Julian in #6422
Performance
- Parallelize lockfile source pypi and conda satisfiability checks by @baszalmstra in #6400
Refactor
New Contributors
- @jevandezande made their first contribution in #6187
Download pixi 0.71.0
| File | Platform | Checksum |
|---|---|---|
| pixi-aarch64-apple-darwin.tar.gz | Apple Silicon macOS | checksum |
| pixi-x86_64-apple-darwin.tar.gz | Intel macOS | checksum |
| pixi-aarch64-pc-windows-msvc.zip | ARM64 Windows | checksum |
| pixi-aarch64-pc-windows-msvc.msi | ARM64 Windows | checksum |
| pixi-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| pixi-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| pixi-riscv64gc-unknown-linux-gnu.tar.gz | RISCV Linux | checksum |
| pixi-aarch64-unknown-linux-musl.tar.gz | ARM64 MUSL Linux | checksum |
| pixi-x86_64-unknown-linux-musl.tar.gz | x64 MUSL Linux | checksum |