Mit folgender Paketstruktur
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── setup.py
Inhalt von setup.py
from setuptools import setup
setup()
Inhalt von setup.cfg
[metadata]
name = my_package
version = 0.1
[options]
packages = find:
Ich kann für Rad oder eine Quelldistribution bauen my_package
wie diese
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
Laut dem Betreuer von setuptools ist eine deklarative Build-Konfiguration jedoch ideal und die Verwendung eines imperativen Builds wird ein Code-Geruch sein. So ersetzen wir setup.py
mit pyproject.toml
:
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── pyproject.toml
Inhalt von pyproject.toml
[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]
Und Sie können ein Rad immer noch so bauen wie zuvor, es funktioniert. Aber sdist funktioniert nicht:
python: can't open file 'setup.py': [Errno 2] No such file or directory
Wie sollten Sie die .tar.gz-Datei mit setuptools erstellen ? Was ist das benutzerbezogene Tool zum Erstellen von SDIST? Ich möchte das Build-Backend nicht ändern. Es sieht so aus, als ob andere Verpackungswerkzeuge alle ihre eigenen Build-Einstiegspunkte schreiben, aber ich dachte, der Sinn der Definition eines deklarativen Build-Systems in den Metadaten bestand darin, dass Sie sich nicht mit dem Build-System vertraut machen mussten, um zu lernen, wie die einzelnen Tools erstellt wurden Es wird erwartet, dass ein anderes Verpackungstool aufgerufen wird oder in den Interpreter gehen und eine Python-API manuell aufrufen muss. Der PEP für Build-Systemanforderungen ist jetzt über 2 Jahre alt. Vermisse ich hier etwas Offensichtliches?
Wie erstelle ich eine Quelldistribution ohne setup.py
Datei?
quelle
pep517.build
was nur als Experiment gedacht ist, als temporäre Krücke, wenn es produktive Werkzeuge wie Flit, Poesie, Luke und wahrscheinlich noch mehr gibt?pep517.build
ist ein einfaches Werkzeug, das genau für diesen Zweck entwickelt wurde.pep517.build
einer von ihnen. Aber überhaupt nicht, es ist eigentlich ein Build-Frontend. Auch Luke ist nicht PEP517 bereit, wie ich jetzt sehe.Es gibt nichts "Offensichtliches", wenn es um Python-Verpackungen geht. In der Tat ist es vorerst erforderlich, zumindest wenn Sie distutils / setuptools verwenden, eine (fast) leere
setup.py
Datei zu erstellen , selbst wenn Sie eine vollständig deklarative Datei verwendensetup.cfg
:Ich empfehle auch
chmod +x setup.py
.In diesem Fall schreiben Sie nur den "Einstiegspunkt" selbst in das Build-System und
setup()
sind nur diemain()
Funktion dafür - aber jetztsetup()
könnensetup.cfg
stattdessen alle Argumente gelesen werden , an die traditionell übergeben wurde .Jetzt können Sie immer noch verwenden,
setup.py sdist
wenn Sie einen Quell-Tarball erstellen möchten:./setup.py sdist
Sie können auch eines der alternativen Build-Systeme ausprobieren, die über aktiviert sind
pyproject.toml
, z. B. Flit .quelle
setup.cfg
bedeutet, dass asetup.py
nicht mehr erforderlich ist, um Setuptools zu verwenden, was nicht stimmt. Nur weil der Titel der Frage irreführend ist, heißt das nicht, dass die Antwort lautet. Sie schrieben in den Text der Frage: "Wie sollten Sie also die .tar.gz-Datei mit setuptools erstellen ?" was dies richtig beantwortet.