Avec la structure de package suivante
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── setup.py
Contenu de setup.py
from setuptools import setup
setup()
Contenu de setup.cfg
[metadata]
name = my_package
version = 0.1
[options]
packages = find:
Je peux construire une roue ou une distribution source my_package
comme celle-ci
pip wheel --no-deps -w dist .
# generates file ./dist/my_package-0.1-py3-none-any.whl
python setup.py sdist
# generates file ./dist/my_package-0.1.tar.gz
Mais selon le responsable de setuptools , une configuration de construction déclarative est idéale et l'utilisation d'une construction impérative va être une odeur de code. Nous remplaçons donc setup.py
par pyproject.toml
:
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── pyproject.toml
Contenu de pyproject.toml
[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]
Et vous pouvez toujours construire une roue de la même manière qu'auparavant, cela fonctionne. Mais sdist ne fonctionne pas:
python: can't open file 'setup.py': [Errno 2] No such file or directory
Alors, comment devez-vous réellement créer le fichier .tar.gz à l' aide de setuptools ? Quel est l'outil accessible à l'utilisateur pour créer sdist? Je ne veux pas changer le backend de build. Il semble que d'autres outils de conditionnement écrivent tous leurs propres points d'entrée de génération, mais je pensais que l'intérêt de définir un système de génération déclaratif dans les métadonnées était de sorte que vous n'ayez pas à vous familiariser avec le système de génération, en apprenant comment chacun un outil de packaging différent s'attend à être appelé ou à devoir aller dans l'interpréteur et appeler une API Python manuellement. Mais le PEP pour les exigences du système de construction a maintenant plus de 2 ans. Suis-je en train de manquer quelque chose d'évident ici?
Comment construire une distribution source sans utiliser de setup.py
fichier?
la source
pep517.build
ce qui ne se veut qu'une expérience, une béquille temporaire lorsqu'il existe des outils productifs tels que le flit, la poésie, la trappe, et probablement encore plus?pep517.build
est un outil simple conçu à cet effet.pep517.build
c'était l'un d'entre eux. Mais pas du tout, c'est en fait un front-end de build. L' écoutille n'est pas non plus prête pour le PEP517 comme je le vois maintenant.Il n'y a rien "d'évident" en ce qui concerne le packaging Python. En effet, pour le moment, au moins si vous utilisez distutils / setuptools, il est nécessaire de créer un
setup.py
fichier (presque) vide , même si vous utilisez un fichier entièrement déclaratifsetup.cfg
:Je recommande aussi
chmod +x setup.py
.Dans ce cas, vous écrivez vous-même le «point d'entrée» dans le système de génération, et vous n'en êtes
setup()
que lamain()
fonction - mais maintenant tous les arguments qui étaient traditionnellement passéssetup()
peuvent être lus à lasetup.cfg
place.Maintenant, vous pouvez toujours utiliser
setup.py sdist
si vous voulez faire un tarball source:./setup.py sdist
Vous pouvez également essayer l'un des systèmes de construction alternatifs qui sont activés via
pyproject.toml
, comme Flit .la source
setup.cfg
signifie qu'ilsetup.py
n'est plus nécessaire d'utiliser setuptools, ce qui n'est pas vrai. Ce n'est pas parce que le titre de la question est trompeur que la réponse l'est. Ils ont écrit dans le corps de la question "Alors, comment devriez-vous réellement construire le fichier .tar.gz en utilisant setuptools ?" auquel cela répond correctement.