48 lines
2.2 KiB
Markdown
48 lines
2.2 KiB
Markdown
# Package a Python Module with Nix
|
|
|
|
Packaging a Python module (`buildPythonPackage`) involves determining the source, dependencies, and build system, typically from `pyproject.toml`. Ensure all dependencies are already packaged before referencing them.
|
|
|
|
More complex cases require special handling. Below are examples for different scenarios.
|
|
|
|
## Normal Python Module
|
|
|
|
See the simple example: [tyro](./tyro/package.nix)
|
|
|
|
## Customize Build System and Disable Tests
|
|
|
|
Some Python modules require additional build tools, or have tests that cannot run in the Nix sandbox. See [Swanboard](./swanboard/package.nix) for an example.
|
|
|
|
## Customize Source Root and Optional Dependencies
|
|
|
|
See [agno](./agno/package.nix) for examples of:
|
|
|
|
- Using `sourceRoot` when the Python module's root differs from the project root (specify the relative path).
|
|
- Handling optional dependencies: include them in `optional-dependencies` when available, or safely omit them if not yet packaged.
|
|
|
|
## Rust-Backed Python Module
|
|
|
|
For Python packages implemented in Rust with Python bindings, use `rustPlatform` as a helper. See [tantivy](./tantivy/package.nix) for an example.
|
|
|
|
## Relax or Remove Dependencies
|
|
|
|
When dependency requirements cannot be satisfied, investigate further:
|
|
|
|
1. **Version mismatch**: If the dependency is packaged but the version requirement is too strict, add it to `pythonRelaxDeps` to bypass version checking.
|
|
2. **Missing dependency**: If the dependency is not packaged, assess whether it's essential for your use case. If not, add it to `pythonRemoveDeps`.
|
|
|
|
See [darts](./darts/package.nix) for an example.
|
|
|
|
## Updating an Existing Python Package
|
|
|
|
Besides the general update steps, also:
|
|
|
|
1. **Update dependencies**: Check `pyproject.toml` or `setup.py` for changed dependencies and update:
|
|
- `dependencies` - Runtime dependencies
|
|
- `build-system` - Build-time dependencies (e.g., setuptools, poetry-core)
|
|
- `optional-dependencies` - If relevant to your use case
|
|
|
|
2. **Handle breaking changes**: New versions may:
|
|
- Drop Python version support (update `pythonOlder` or `disabled`)
|
|
- Change build backends (update `build-system` based on `pyproject.toml`)
|
|
- Add new test dependencies (update `nativeCheckInputs` or `checkInputs`)
|