Any documentation I've found about this topic mentions that the "only" requirement to build a deb package is to have a correct setup.py
(and requirements.txt
). For instance in dh-virtualenv tutorial, stdeb documentation and the Debian's library style guide for python.
But nowadays new (amazing) tools like poetry allow to develop (and upload to PyPI) python projects without any setup.py
(this file and several others including requirements.txt
are all replaced by pyproject.toml
). I believe flit allows this too.
I have developed a python project managed by poetry and would like to package it for Ubuntu/Debian. I guess, as a workaround I can still write a setup.py
file that would take its values from pyproject.toml
and a requirements.txt
file (written by hand using values from poetry.lock
).
But, is there a way to do this without any setup.py
file?
setuptools
, and the setup.py
file that it requires, has been the de-facto packaging standard in python for the longest time. The new package managers you mention were enabled by the introduction of PEP 517
and PEP 518
(or read this for a high-level description on the topic), which provide a standardized way of specifying the build backend without the need of a setup.py
(and the ensuing hen-egg problem where you already need setuptools
to correctly parse it, but might also need to specify which version of setuptools you want for the build).
Anyway, it's all still very fresh, and the linux packaging community hasn't fully caught up yet. I found this discussion on the debian bug tracker, and the rpm
side sums it up neatly over here.
The short answer is to just wait a while until the toolchain catches up to the new standards, and google debian packaging pep517 support
every now and then.
As a workaround for poetry
-build packages specifically, you can use dephell
to generate the setup.py
, and poetry
to generate the requirements.txt
for you to keep using legacy tools:
dephell deps convert --from=poetry --to=setuppy
poetry export -f requirements.txt -o requirements.txt
And, during the build, tell your pyproject.tom
that you plan to use setuptools
for the build instead of poetry
:
[build-system]
requires = ["setuptools >= 40.6.0", "wheel"]
build-backend = "setuptools.build_meta"