PEP 627 – Aufzeichnung installierter Projekte
- Autor:
- Petr Viktorin <encukou at gmail.com>
- BDFL-Delegate:
- Paul Moore <p.f.moore at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 15. Juli 2020
- Resolution:
- Discourse-Nachricht
Zusammenfassung
Diese PEP klärt und aktualisiert PEP 376 (Datenbank installierter Python-Distributionen), indem sie diese als Interoperabilitätsstandard neu schreibt. Sie verlegt den kanonischen Speicherort des Standards in das Spezifikationsrepository der Python Packaging Authority (PyPA) und legt Richtlinien für dessen Änderung fest.
Zwei Dateien in installierten .dist-info-Verzeichnissen werden optional: RECORD (die PEP 376 als obligatorisch aufführt, aber vorschlägt, sie für „Systempakete“ wegzulassen) und INSTALLER.
Motivation
Python-Packaging bewegt sich weg von der Abhängigkeit von spezifischen Werkzeugen (Setuptools und pip) hin zu einem Ökosystem von Werkzeugen und Werkzeug-unabhängigen Interoperabilitätsstandards.
PEP 376 ist nicht als Interoperabilitätsstandard geschrieben. Sie beschreibt Implementierungsdetails spezifischer Werkzeuge und Bibliotheken und ist unter-spezifiziert, was viel Raum für implementierungsdefiniertes Verhalten lässt.
Dies ist ein Vorschlag, den Standard aus PEP 376 zu „destillieren“, ihn zu klären und neu zu schreiben, um werkzeugunabhängig zu sein.
Ziel dieser PEP ist ein besserer Standard, nicht unbedingt ein perfekter. Einige Probleme werden für spätere Klärungen zurückgestellt.
Begründungsänderung
PEP 376’s Begründung konzentriert sich auf zwei Probleme
- Es gibt zu viele Möglichkeiten, Projekte zu installieren, und dies erschwert die Interoperation.
- Es gibt keine API, um Informationen über installierte Distributionen zu erhalten.
Das neue Dokument konzentriert sich ausschließlich auf das On-Disk-Format von Informationen über installierte Projekte. Die Bereitstellung von APIs zur Installation, Deinstallation oder Abfrage dieser Informationen bleibt der Implementierung durch Werkzeuge überlassen.
Standard- und Änderungsverfahren
Der kanonische Standard für die Aufzeichnung installierter Projekte (früher bekannt als Datenbank installierter Python-Distributionen) ist die Dokumentation unter packaging.python.org. Jegliche Änderungen am Dokument (außer geringfügigen Sprach- oder Typografiekorrekturen) müssen über das PEP-Verfahren erfolgen.
Das Dokument ist normativ (mit Beispielen zur besseren Verständlichkeit). PEPs, die es ändern, wie diese hier, enthalten zusätzliche Informationen, die veralten können, wie Begründungen und Kompatibilitätsüberlegungen.
Der vorgeschlagene Standard wird zusammen mit dieser PEP als Pull-Request an packaging.python.org übermittelt.
Änderungen und ihre Begründung
Umbenennung in „Aufzeichnung installierter Projekte“
Der Standard wird von Datenbank installierter Python-Distributionen in Aufzeichnung installierter Projekte umbenannt.
Auch wenn das Ablegen von Dateien an bekannten Speicherorten auf der Festplatte als „Datenbank“ angesehen werden kann, entspricht dies nicht dem, was die meisten Leute unter dem Begriff verstehen. Die PyPA verlinkt zu PEP 376 unter der Überschrift Aufzeichnung installierter Distributionen.
Das PyPA-Glossar definiert „Distribution“ (oder „Distribution Package“, um Verwechslungen mit z. B. Linux-Distributionen zu vermeiden) als „eine versionierte Archivdatei […]“. Da es andere Möglichkeiten geben kann, Python-Code zu installieren, als aus Archivdateien, verwendet das Dokument „installiertes Projekt“ anstelle von „installierte Distribution“.
Entfernung von Implementierungsdetails
Alle werkzeug- und bibliotheksspezifischen Details werden entfernt. Auch die Mechanismen, wie ein Projekt installiert wird, werden weggelassen: Das Dokument konzentriert sich auf den Endzustand. Eine Ausnahme bildet ein Entwurf eines Deinstallationsalgorithmus, der zur besseren Erklärung des Zwecks der RECORD-Datei gegeben wird.
Verweise auf .egg-info und .egg, Formate, die spezifisch für setuptools und distutils sind, werden weggelassen.
Explizite Zulassung zusätzlicher Dateien
Das .dist-info-Verzeichnis darf Dateien enthalten, die nicht in der Spezifikation aufgeführt sind. Die aktuellen Werkzeuge tun dies bereits.
Eine Notiz in der Spezifikation erwähnt Dateien im .dist-info-Verzeichnis von Wheels. Aktuelle Werkzeuge kopieren diese Dateien in das installierte .dist-info – etwas, das für zukünftige Standardisierungsbemühungen zu beachten ist.
Klarstellungen in der RECORD-Datei
Die CSV-Dialektik wird als Standard des Python-Moduls csv spezifiziert. Dies löst Grenzfälle bei der Handhabung von doppelten Anführungszeichen und Zeilenumbrüchen in Dateinamen.
Die „Basis“ relativer Pfade in RECORD ist relativ zum .dist-info-Verzeichnis spezifiziert, anstatt tool-spezifische Optionen --install-lib und --prefix zu verwenden.
Sowohl die Felder Hash als auch Größe sind nun optional (für jede Datei, nicht nur für .pyc, .pyo und RECORD). Das Weglassen wird nicht empfohlen, außer für *.pyc und RECORD selbst. (Beachten Sie, dass PEP 376 unklar darüber ist, was optional war; wörtlich genommen widersprechen sich ihr Text und ihre Beispiele. Trotzdem ist „beide Felder sind optional“ eine angemessene Interpretation von PEP 376. Die Alternative wäre, zu mandatierten – anstatt zu empfehlen –, welche Dateien ohne Hash und Größe aufgezeichnet werden können, und diese Liste im Laufe der Zeit mit neuen Anwendungsfällen zu aktualisieren.)
Die neue Spezifikation besagt ausdrücklich, dass die RECORD-Datei nun alle Dateien des installierten Projekts enthalten muss (die Ausnahme für .pyc-Dateien bleibt bestehen). Da Werkzeuge RECORD für die Deinstallation verwenden, könnten unvollständige Dateilisten zu verwaisten Dateien in den Umgebungen der Benutzer führen. Andererseits bedeutet dies, dass es keine Möglichkeit gibt, Hashes einiger beliebiger Dateien aufzuzeichnen, wenn die vollständige Liste der Dateien unbekannt ist.
Ein Entwurf eines Deinstallationsalgorithmus ist enthalten, um den Hauptzweck und Inhalt der Datei zu verdeutlichen.
Werkzeuge dürfen keine Projekte deinstallieren/entfernen, denen eine RECORD-Datei fehlt (es sei denn, sie verfügen über externe Informationen, wie z. B. in Systempaketmanagern von Linux-Distributionen).
Unter Windows können Dateien in RECORD entweder durch / oder \ getrennt sein. PEP 376 war hierzu unklar: Sie schreibt an einer Stelle Vorwärtsschrägstriche vor, zeigt aber in einem Windows-spezifischen Beispiel Rückwärtsschrägstriche.
Optionale RECORD-Datei
Die RECORD-Datei wird optional gemacht. Nicht alle Werkzeuge können einfach eine Liste installierter Dateien in einem Python-spezifischen Format generieren.
Insbesondere ist die RECORD-Datei unnötig, wenn Projekte von einem Linux-Systempaketmanager installiert werden, der eigene Wege hat, Dateien zu verfolgen, zu deinstallieren oder ihre Integrität zu prüfen. Eine RECORD-Datei mit der Festplatte und der Systempaketdatenbank synchron zu halten, wäre unangemessen fragil, und keine RECORD-Datei ist besser als eine, die nicht der Realität entspricht.
(Offenlegung: Der Autor dieser PEP ist ein RPM-Paketierer, der in der Fedora-Linux-Distribution aktiv ist.)
Optionale INSTALLER-Datei
Die INSTALLER-Datei wird ebenfalls optional gemacht und als nur zu Informationszwecken dienend spezifiziert. Sie bleibt eine einzeilige Textdatei, die den Namen des Installers enthält.
Diese Datei wurde ursprünglich hinzugefügt, um Projekte zu unterscheiden, die vom Python-Installer (pip) installiert wurden, von denen, die von anderen Paketmanagern (z. B. dnf) installiert wurden. Es gab Versuche, diese Datei zu verwenden, um zu verhindern, dass pip Pakete aktualisiert oder deinstalliert, die es nicht installiert hat.
Unser Ziel ist die Unterstützung von interoperierenden Werkzeugen, und jede Aktion auf der Grundlage des Werkzeugs, das ein Paket zufällig installiert hat, widerspricht diesem Ziel.
Anstatt sich auf den Installer-Namen zu verlassen, sollten Werkzeuge Feature-Erkennung nutzen. Das aktuelle Dokument bietet eine grobe Möglichkeit, ein Projekt für Python-Werkzeuge unberufbar zu machen: das Weglassen der RECORD-Datei.
Andererseits kann der Installer-Name nützliche Hinweise für den Benutzer liefern.
Um diesem neuen Zweck der Datei Rechnung zu tragen, erlaubt die neue Spezifikation jede ASCII-Zeichenkette in INSTALLER, anstatt eines kleingeschriebenen Bezeichners. Sie schlägt auch vor, die Kommandozeile zu verwenden, falls verfügbar.
Die REQUESTED-Datei: Aus der Spezifikation entfernt
Die REQUESTED-Datei wird nun als werkzeugspezifische Erweiterung betrachtet.
Gemäß PEP 376 sollte REQUESTED geschrieben werden, wenn ein Projekt auf direkte Benutzeranforderung installiert wurde, im Gegensatz zur automatischen Installation zur Erfüllung von Abhängigkeiten eines anderen Projekts. Projekte ohne diese Markierungsdatei konnten deinstalliert werden, wenn sie nicht mehr benötigt wurden.
Trotz des Standards schreiben viele bestehende Installer (einschließlich älterer Versionen von pip) diese Datei nie. Es gibt keine Unterscheidung zwischen Projekten, die „entfernbar sind, wenn nicht mehr benötigt“, und solchen, die einfach von einem Werkzeug installiert wurden, das REQUESTED ignoriert. Daher ist die Datei derzeit nicht für ihren beabsichtigten Zweck nutzbar (es sei denn, ein Werkzeug kann zusätzliche, nicht standardmäßige Informationen verwenden).
Klarstellungen
Wenn möglich, werden Begriffe (wie name und version) durch Verweise auf bestehende Spezifikationen qualifiziert.
Zurückgestellte Ideen
Um den Umfang dieser PEP zu begrenzen, werden einige Verbesserungen ausdrücklich zukünftigen PEPs überlassen
- Kodierung der
RECORD-Datei - Begrenzung oder Namensraumung von Dateien, die in
.dist-infoerscheinen können - Kennzeichnung des Unterschieds zwischen Projekten, die direkt auf Benutzeranforderung installiert wurden, und denen, die zur Erfüllung von Abhängigkeiten installiert wurden, damit letztere entfernt werden können, wenn sie nicht mehr benötigt werden.
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0627.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT