How to Add Extra Data to a Python Package
,Today, I learned how to include external files in a Python package using uv
and the hatchling build backend. My goal was to add a directory containing sample fixture data to the package. Here’s the resulting pyproject.toml
file:
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.sdist]
packages = ["src/mypackage"]
[tool.hatch.build.targets.sdist.force-include]
"data/fixtures" = "mypackage/fixtures" # Include the fixtures directory in the sdist
[tool.hatch.build.targets.wheel]
packages = ["src/mypackage"]
[tool.hatch.build.targets.wheel.force-include]
"data/fixtures" = "mypackage/fixtures" # Include the fixtures directory in the wheel
This turned out to be surprisingly tricky to get right, and the toml
file doesn’t make it immediately clear which paths are the source and which are the target in the sdist
and wheel
. So, here’s an overview of the directory structure:
project_root/
├── src/
│ └── mypackage/
│ ├── __init__.py
│ ├── module1.py
│ └── fixtures/ # Included as mypackage/fixtures by pyproject.toml
│ ├── fixture1.json
│ └── fixture2.json
├── data/
│ └── fixtures/
│ ├── fixture1.json
│ └── fixture2.json
├── pyproject.toml
└── README.md