PEP 527 – Entfernen von ungenutzten/wenig genutzten Dateitypen/Erweiterungen auf PyPI
- Autor:
- Donald Stufft <donald at stufft.io>
- BDFL-Delegate:
- Alyssa Coghlan <ncoghlan at gmail.com>
- Discussions-To:
- Distutils-SIG Liste
- Status:
- Final
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 23. August 2016
- Post-History:
- 23. August 2016
- Resolution:
- Distutils-SIG Nachricht
Zusammenfassung
Dieser PEP empfiehlt die Deprezierung und letztendliche Entfernung der Unterstützung für das Hochladen bestimmter ungenutzter oder wenig genutzter Dateitypen und Erweiterungen auf PyPI. Insbesondere wird empfohlen, zukünftige Uploads von Dateien der Typen bdist_dumb, bdist_rpm, bdist_dmg, bdist_msi und bdist_wininst nicht mehr zuzulassen. PyPI soll dann nur noch neue Uploads der Dateitypen sdist, bdist_wheel und bdist_egg akzeptieren.
Darüber hinaus schlägt dieser PEP vor, die Unterstützung für neue Uploads von sdists mit den Erweiterungen .tar, .tar.bz2, .tar.xz, .tar.Z, .tgz, .tbz und allen anderen Erweiterungen außer .tar.gz und .zip zu entfernen.
Schließlich schlägt dieser PEP auch vor, die Anzahl der zulässigen sdist-Uploads für jede einzelne Version eines Projekts auf PyPI auf eins zu beschränken, anstatt auf eine pro erlaubter Erweiterung.
Begründung
Dateiformate
Derzeit unterstützt PyPI die folgenden Dateitypen
sdistbdist_wheelbdist_eggbdist_wininstbdist_msibdist_dmgbdist_rpmbdist_dumb
Diese verschiedenen Dateitypen haben jedoch unterschiedliche Nützlichkeitsgrade oder allgemeine Verwendung im Ökosystem. Ihre fortgesetzte Unterstützung verursacht einen Wartungsaufwand für PyPI sowie für Tool-Autoren und verursacht Kosten sowohl für Bandbreite als auch für Speicherplatz, nicht nur auf PyPI selbst, sondern auch auf allen Spiegelservern von PyPI.
Python-Packaging ist ein mehrstufiges Ökosystem, in dem PyPI hauptsächlich zur Verteilung von virtuellen Umgebung-kompatiblen Paketen direkt von den jeweiligen Projektbesitzern geeignet und genutzt wird. Diese Pakete werden dann entweder direkt von Endbenutzern oder von nachgelagerten Verteiler*innen konsumiert, die diese Pakete nehmen und sie in ihre jeweiligen systemweiten Pakete (wie RPM, deb, MSI usw.) umwandeln.
Während PyPI selbst nur direkt mit diesen plattformunabhängigen, aber Python-spezifischen Paketen arbeitet, fördern wir gemeinschaftsgetriebene und kommerzielle Konvertierungen dieser Pakete in nachgelagerte Formate für bestimmte Zielumgebungen, wie zum Beispiel:
- Das plattformübergreifende Datenanalyse-Ökosystem von Conda (conda-forge)
- Das deb-basierte Linux-Ökosystem (Debian, Ubuntu usw.)
- Das RPM-basierte Linux-Ökosystem (Fedora, openSuSE, Mageia usw.)
- Die Ökosysteme Homebrew, MacPorts und Fink für Mac OS X
- Das Windows-Paketmanagement-Ökosystem (NuGet, Chocolatey usw.)
- Erstellung von Windows MSIs und Installern durch Dritte (z. B. Christoph Gohlkes Arbeit unter http://www.lfd.uci.edu/~gohlke/pythonlibs/)
- Andere kommerzielle Weiterverteilungsformate (ActiveStates PyPM, Enthought Canopy usw.)
- Andere Open-Source-Community-Weiterverteilungsformate (Nix, Gentoo, Arch, *BSD usw.)
Die Überzeugung dieses PEP ist, dass das gesamte Ökosystem am besten unterstützt wird, indem PyPI auf die plattformunabhängigen Formate konzentriert bleibt, wo die begrenzte Zeit von Freiwilligen am besten genutzt werden kann, anstatt die verfügbare Zeit auf mehrere Plattformen zu verteilen. Darüber hinaus ist dieser PEP der Meinung, dass die Personen, die am besten positioniert sind, gut integrierte Pakete für eine bestimmte Plattform bereitzustellen, diejenigen sind, die sich auf diese Plattform konzentrieren und nicht auf alle möglichen Plattformen.
bdist_dumb
Wie der Name schon sagt, ist bdist_dumb kein sehr komplexes Format, aber es ist so einfach, dass es für die tatsächliche Nutzung wertlos ist.
Wenn Sie zum Beispiel unter macOS pyenv verwenden und eine Bibliothek mit Python 3.5 erstellen, erzeugt bdist_dumb eine Datei namens exampleproject-1.0.macosx-10.11-x86_64.tar.gz. Schon der Dateiname ist schwer von einem sdist zu unterscheiden, da beide dieselbe Dateierweiterung verwenden (und mit den älteren Versionen vor PEP 440 war 1.0-macosx-10.11-x86_64 eine gültige, wenn auch ziemlich alberne, Versionsnummer). Wenn Sie jedoch das erstellte .tar.gz öffnen, würden Sie feststellen, dass sich darin keine Metadaten befinden, die für Dinge wie die Abhängigkeitsermittlung verwendet werden könnten, und tatsächlich ist es einfach ein Tarball, der fest kodierte Pfade zu den Stellen enthält, an denen die Dateien auf dem Computer, der den bdist_dumb erstellt hat, installiert worden wären. Zurück zu unserem pyenv-on-macOS-Beispiel bedeutet dies, dass es, wenn ich es erstellt hätte, Dateien wie diese enthalten würde:
Users/dstufft/.pyenv/versions/3.5.2/lib/python3.5/site-packages/example.py
bdist_rpm
Das bdist_rpm-Format auf PyPI erlaubt es Leuten, .rpm-Dateien hochzuladen, die Endbenutzer*innen manuell herunterladen und dann manuell installieren können. Die gängige Verwendung von rpm erfolgt jedoch mit einem speziell entwickelten Repository, das die automatische Installation von Abhängigkeiten, Upgrades usw. ermöglicht, was PyPI nicht bietet. Daher ist dies ein Dateityp, der auf PyPI kaum genutzt wird, mit nur etwa 460 hochgeladenen Dateien dieses Typs (von insgesamt 662.544).
Darüber hinaus bieten Dienste wie COPR einen besser unterstützten Mechanismus für die Veröffentlichung und Nutzung von RPM-Dateien als wir es jemals auf PyPI erreichen werden.
bdist_dmg, bdist_msi und bdist_wininst
Die Formate bdist_dmg, bdist_msi und bdist_winist sind ähnlich, da sie OS-spezifische Installer sind, die eine Bibliothek nur in eine Umgebung installieren und nicht für endbenutzerfreundliche Installationen von Anwendungen konzipiert sind (was Dinge wie das Bündeln eines Python-Interpreters und ähnliches erfordern würde).
Von diesen dreien ist die Nutzung von bdist_dmg und bdist_msi sehr gering, mit nur ca. 500 bdist_msi-Dateien und ca. 50 bdist_dmg-Dateien, die auf PyPI hochgeladen wurden. Das bdist_wininst-Format hat mehr Nutzen, mit ca. 14.000 Dateien, die jemals auf PyPI hochgeladen wurden.
Es ist ziemlich einfach, anhand der geringen Nutzung von bdist_dmg und bdist_msi zu dem Schluss zu kommen, dass ihre Entfernung geringe Auswirkungen haben wird, jedoch hat bdist_wininst um mehrere Größenordnungen mehr Nutzung. Dies ist jedoch etwas irreführend, denn obwohl mehr Leute diese Dateien hochladen, ist die tatsächliche Nutzung dieser hochgeladenen Dateien ziemlich gering. Wenn wir uns die letzten 30 Tage ansehen, sehen wir, dass 90% aller Downloads von bdist_winist-Dateien von PyPI durch die Spiegelinfrastruktur generiert wurden und 7% davon von setuptools generiert wurden (was derzeit besser durch bdist_egg-Dateien abgedeckt werden kann).
Angesichts der geringen Anzahl von für bdist_dmg und bdist_msi hochgeladenen Dateien und der Tatsache, dass bdist_wininst hauptsächlich dazu dient, entweder Bandbreite und Speicherplatz über die Spiegelinfrastruktur zu verbrauchen *oder* trivial durch bdist_egg ersetzt werden könnte, schlägt dieser PEP vor, diese drei Formate in die Liste der zu verbietenden aufzunehmen.
Dateierweiterungen
Derzeit unterstützt sdist eine Vielzahl von Dateierweiterungen wie .tar.gz, .tar, .tar.bz2, .tar.xz, .zip, .tar.Z, .tgz und .tbz. Von diesen erhalten jedoch nur die Erweiterungen .tar.gz mit derzeit 444.338 sdists, .zip mit derzeit 58.774 sdists und .tar.bz2 mit derzeit 3.265 sdists mehr als nur vernachlässigbare Nutzung.
Das Vorhandensein mehrerer akzeptierter Formate erfordert, dass sowohl PyPI als auch externe Tools alle verschiedenen Erweiterungen behandeln können, die verwendet *werden könnten* (auch wenn niemand sie derzeit verwendet). Dies betrifft nicht nur PyPI, sondern wirkt sich auf das gesamte Ökosystem aus. Darüber hinaus haben die verschiedenen Formate unterschiedliche Anforderungen an optionale C-Bibliotheken, mit denen Python verknüpft wurde, und unterschiedliche Anforderungen an die Python-Versionen, die sie unterstützen. Außerdem schaffen mehrere Formate eine seltsame Situation, in der es zwei sdist-Dateien für ein bestimmtes Projekt/eine bestimmte Version mit subtil unterschiedlichem Inhalt geben kann.
Es ist leicht zu argumentieren, dass alles außerhalb von .tar.gz, .zip und .tar.bz2 verboten werden sollte. Abgesehen von einer winzigen Handvoll hat niemand diese anderen Dateitypen in den rund 15 Jahren der Existenz von PyPI aktiv hochgeladen, daher waren sie offensichtlich nicht besonders nützlich. Obwohl .tar.xz theoretisch ein besseres Format als die anderen .tar.*-Formate ist, da es eine bessere Kompressionsrate mit LZMA erzielt, ist es nur in Python 3.3+ verfügbar und hat eine optionale Abhängigkeit von der lzma-C-Bibliothek.
Betrachtet man die drei Erweiterungen, die wir derzeit verwenden, ist es auch recht einfach zu dem Schluss zu kommen, dass .tar.bz2 ebenfalls verboten werden kann. Es gibt eine ziemlich kleine Anzahl von Dateien, die jemals damit hochgeladen wurden, und es erfordert eine zusätzliche optionale C-Bibliothek zur Handhabung der bzip2-Kompression.
Schließlich landen wir bei .tar.gz und .zip. Betrachtet man die reinen Zahlen für diese beiden, sehen wir, dass .tar.gz mit insgesamt 444.338 Uploads das mit Abstand am häufigsten hochgeladene Format ist, verglichen mit 58.774 von .zip. Auf POSIX-Betriebssystemen ist .tar.gz auch der Standard, der von allen aktuell veröffentlichten Versionen von Python und setuptools erzeugt wird. Darüber hinaus verwenden beide Dateitypen dieselbe C-Bibliothek (zlib), die auch für bdist_wheel und bdist_egg erforderlich ist. Die beiden kniffligen Punkte bei der Entscheidung zwischen .tar.gz und .zip sind, dass auf POSIX-Betriebssystemen .tar.gz der Standard ist, während unter Windows .zip der Standard ist und das bdist_wheel-Format ebenfalls Zip verwendet.
Anstatt zu versuchen, sich entweder auf .tar.gz oder .zip zu standardisieren, schlägt dieser PEP vor, dass wir *entweder* .tar.gz *oder* .zip für sdists zulassen.
Beschränkung der Anzahl von sdists pro Release
Ein sdist auf PyPI sollte eine einzige Quelle der Wahrheit für eine bestimmte Softwareversion sein. Derzeit erlaubt PyPI jedoch den Upload eines sdists für jede der erlaubten sdist-Dateierweiterungen. Derzeit sind dies etwa 10 verschiedene sdists für ein Projekt, aber selbst mit diesem PEP erlaubt dies zwei verschiedene Wahrheitsquellen für eine einzelne Version. Das Vorhandensein mehrerer sdists kann oft seltsame Fehler erklären, die sich nur dadurch äußern, welcher sdist von der Person verwendet wurde.
Um dies zu beheben, schlägt dieser PEP vor, einen und nur einen sdist pro Release eines Projekts zuzulassen.
Entfernungsprozess
Dieser PEP schlägt NICHT vor, bestehende Dateien von PyPI zu entfernen, sondern nur, neue Uploads zu verbieten. Diese Einschränkung wird projektbezogen eingeführt, um Projekten die Anpassung an die neuen Beschränkungen zu ermöglichen, wo dies zutrifft.
Zuerst werden alle *bestehenden* Projekte markiert, um das Hochladen von Legacy-Dateitypen zu ermöglichen. Jedes Projekt ohne diese Markierung (d.h. neue Projekte) kann dann nichts anderes als sdist mit der Erweiterung .tar.gz oder .zip, bdist_wheel und bdist_egg hochladen. Dann werden bestehende Projekte, die noch nie eine Datei hochgeladen haben, die die Legacy-Dateityp-Markierung erfordert, von dieser Markierung befreit und fallen somit unter die neuen Beschränkungen. Schließlich wird eine E-Mail an die Betreuer*innen aller Projekte gesendet, denen noch die Legacy-Markierung zugewiesen ist, die sie über die bevorstehenden neuen Beschränkungen für Uploads informiert und ihnen mitteilt, dass diese Beschränkungen ab 1 Monat für zukünftige Uploads zu ihren Projekten gelten werden. Nach einem Monat wird dann allen Projekten die Legacy-Dateityp-Markierung entfernt, und die Unterstützung für das Hochladen dieser Dateitypen wird auf PyPI eingestellt.
Dieser Plan sollte minimale Störungen verursachen, da er keine bestehenden Dateien entfernt und die Dateitypen, deren Upload verhindert wird, entweder nicht besonders nützliche (oder genutzte) Dateitypen sind *oder* sie können weiterhin einen ähnlichen Dateityp mit einer geringfügigen Änderung ihres Prozesses hochladen.
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0527.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT