PEP 766 – Explizite Prioritätswahl zwischen mehreren Indizes
- Autor:
- Michael Sarahan <msarahan at gmail.com>
- Sponsor:
- Barry Warsaw <barry at python.org>
- PEP-Delegate:
- Paul Moore <p.f.moore at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Entwurf
- Typ:
- Informational
- Thema:
- Packaging
- Erstellt:
- 18. Nov. 2024
- Post-History:
- 18. Nov. 2024
Zusammenfassung
Die Paketauflösung ist ein Schlüsselbestandteil der Python-Benutzererfahrung, da sie die Mittel zur Erweiterung der Kernfunktionalität von Python darstellt. Das Erlebnis der Paketauflösung wird meist als selbstverständlich hingenommen, bis jemand auf eine Situation stößt, in der der Paketinstaller etwas tut, was er nicht erwartet. Das Verhalten des Installers bei mehreren Indizes war eine häufige Quelle für unerwartetes Verhalten. Durch seine Allgegenwart hat pip lange Zeit das erwartete Standardverhalten für andere Tools im Ökosystem definiert, aber Python-Installer divergieren in Bezug darauf, wie sie mehrere Indizes handhaben. Im Kern dieser Divergenz steht die Frage, ob die Indexinhalte vor der Auflösung von Distributionen kombiniert werden oder ob jeder Index einzeln in Reihenfolge behandelt wird. pip kombiniert alle Indizes, bevor es Distributionen abgleicht, während uv Distributionen in einem Index abgleicht, bevor es zum nächsten übergeht. Jeder Ansatz hat Vor- und Nachteile. Dieses PEP zielt darauf ab, jedes dieser Verhaltensweisen zu beschreiben, die als „Version Priorität“ bzw. „Index Priorität“ bezeichnet werden, damit Community-Diskussionen und Fehlerbehebungen einen gemeinsamen Wortschatz teilen können und damit Tools vorhersagbares Verhalten auf der Grundlage dieser Beschreibungen implementieren können.
Motivation
Python-Paketnutzer finden sich häufig in der Notwendigkeit wieder, einen Index oder eine Paketquelle anzugeben, die sich von PyPI unterscheidet. Es gibt viele Gründe für die Existenz externer Indizes
- Dateigrößen-/Kontingentbeschränkungen auf PyPI
- Implementierungsvarianten, wie z. B. verschiedene Builds von GPU-Bibliotheken in PyTorch
- Lokale Builds von Paketen, die intern in einer Organisation geteilt werden
- Situationen, in denen ein lokales Paket entfernte Abhängigkeiten hat und der Benutzer lokale Pakete gegenüber entfernten Abhängigkeiten bevorzugen möchte, während er bei Bedarf weiterhin auf entfernte Abhängigkeiten zurückfällt
In den meisten dieser Fälle ist es nicht wünschenswert, PyPI vollständig zu umgehen. Stattdessen möchten Benutzer im Allgemeinen, dass PyPI weiterhin eine Quelle für Pakete ist, aber eine Quelle mit niedrigerer Priorität. Leider schließt das aktuelle Design von pip dieses Konzept der Priorität aus. Einige Python-Installer-Tools haben alternative Wege zur Handhabung mehrerer Indizes entwickelt, die Mechanismen zur Ausdruck von Indexpriorität beinhalten, wie z. B. uv und PDM.
Die Innovation und das Potenzial für Anpassung sind spannend, aber sie bergen das Risiko einer weiteren Fragmentierung des Python-Paket-Ökosystems, das bereits als einer der Schwachpunkte von Python wahrgenommen wird. Die Motivation dieses PEP ist es, Installer zu ermutigen, mehr Einblick in die Art und Weise zu geben, wie sie mehrere Indizes handhaben, und einen gemeinsamen Wortschatz für die breitere Community bereitzustellen.
Spezifikation
„Version Priorität“
Dieses Verhalten zeichnet sich dadurch aus, dass der Installer immer die „beste“ Version eines Pakets abruft, unabhängig davon, aus welchem Index sie stammt. „Beste“ wird durch den Algorithmus des Installers zur Optimierung der verschiedenen Merkmale eines Pakets definiert, wobei auch Benutzereingaben berücksichtigt werden (z. B. Bevorzugung von nur Binärdateien oder keinen Binärdateien). Während sich Installer in ihren Optimierungskriterien und Benutzeroptionen unterscheiden können, ist das gemeinsame Merkmal aller Version-Priorität-Installer, dass die Indexinhalte vor der Kandidatenauswahl zusammengefasst werden.
Version Priorität ist am nützlichsten, wenn alle konfigurierten Indizes gleichermaßen vertrauenswürdig sind und sich in Bezug auf die Annahme der Austauschbarkeit von Distributionen gut verhalten. Spiegel sind in dieser Hinsicht besonders gut. Diese Annahme der Austauschbarkeit macht den Vergleich von Distributionen eines bestimmten Pakets sinnvoll. Ohne sie vergleicht der Installer nicht mehr „Äpfel mit Äpfeln“. In der Praxis ist es üblich, dass verschiedene Indizes Dateien mit unterschiedlichen Inhalten als andere Indizes haben, z. B. Builds für spezielle Hardware oder unterschiedliche Metadaten für dasselbe Paket. Version-Priorität-Verhalten kann in diesen Fällen zu unerwünschten, unerwarteten Ergebnissen führen, und hier suchen Benutzer im Allgemeinen nach einer Art von Index Priorität. Darüber hinaus bietet Version Priorität, wenn es Unterschiede im Vertrauen zwischen Indizes gibt, keine Möglichkeit, vertrauenswürdigere Indizes gegenüber weniger vertrauenswürdigen zu bevorzugen. Dies wurde durch Dependency-Confusion-Angriffe ausgenutzt, und PEP 708 wurde als Möglichkeit vorgeschlagen, eine Vorstellung von vertrauenswürdigen externen Indizes fest in den Index zu kodieren.
Der Name „Version Priorität“ ist neu, und die Einführung neuer Begriffe sollte immer minimiert werden. Dieses PEP blickt auf das uv-Projekt, das seine Implementierung des Version-Prioritätsverhaltens als „unsafe-best-match“ bezeichnet. Benennung ist hier wirklich schwierig. Einerseits ist es nicht richtig, das Standardverhalten von pip als intrinsisch „unsicher“ zu bezeichnen. Die Hinzufügung von potenziell bösartigen Indizes ist es, die Bedenken bei diesem Verhalten hervorruft. PEP 708 fügte eine Möglichkeit hinzu, Installer daran zu hindern, Pakete aus unerwarteten, potenziell unsicheren Indizes zu beziehen. Andererseits ist der Begriff „best-match“ technisch korrekt, aber auch irreführend. Der „best-match“ variiert je nach Benutzer und Anwendung. „Best“ ist technisch korrekt im Sinne, dass es sich um ein globales Optimum gemäß den oben genannten Kriterien handelt, aber das ist nicht unbedingt das, was für den Benutzer „am besten“ ist. „Version Priorität“ ist ein vorgeschlagener Begriff, der die Bedenken hinsichtlich der uv-Terminologie vermeidet und gleichzeitig das Verhalten auf die für den Benutzer am besten identifizierbare Weise annähert, wie Pakete verglichen werden.
„Index Priorität“
Bei Index Priorität findet der Resolver Kandidaten für jeden Index einzeln. Der Resolver geht zu nachfolgenden Indizes nur über, wenn die aktuelle Paketnachfrage keine brauchbaren Kandidaten hat. Index Priorität kombiniert Indizes nicht zu einem globalen, flachen Namespace. Da Indizes in der Reihenfolge durchsucht werden, wird das Paket aus einem früheren Index gegenüber einem Paket aus einem späteren Index bevorzugt, unabhängig davon, ob der spätere Index eine bessere Übereinstimmung mit den Optimierungskriterien des Installers hatte. Für einen gegebenen Installer sollten die Optimierungskriterien und der Auswahlalgorithmus sowohl für Index Priorität als auch für Version Priorität gleich sein. Nur die Behandlung mehrerer Indizes unterscheidet sich: alle zusammen für Version Priorität und einzeln für Index Priorität.
Die Reihenfolge der Spezifikation von Indizes bestimmt ihre Priorität im Suchprozess. Daher muss die Art und Weise, wie Installer die Indexkonfiguration laden, vorhersagbar und reproduzierbar sein. Dieses PEP schreibt keinen bestimmten Mechanismus vor, außer zu sagen, dass Installer eine Möglichkeit bieten sollten, ihre Sammlung von Quellen zu ordnen. Installer sollten idealerweise auch optionale Debug-Ausgaben bereitstellen, die Einblicke geben, welcher Index gerade betrachtet wird.
Der Finder jedes Pakets sollte am Anfang der Indexliste beginnen, sodass jedes Paket mit der Indexliste neu beginnt. Anders ausgedrückt: Wenn ein Paket keinen gültigen Kandidaten im ersten Index hat, aber im zweiten Index einen Treffer findet, sollten nachfolgende Pakete immer noch mit der Suche im ersten Index beginnen, anstatt im zweiten zu beginnen.
Ein wünschenswertes Verhalten, das die Index-Prioritätsstrategie impliziert, ist, dass es keine „Überraschungs“-Updates gibt, bei denen ein Versionssprung in einem Index mit niedrigerer Priorität über einem kuratierten, genehmigten Index mit höherer Priorität gewinnt. Dies hängt mit der Sicherheitsverbesserung von PEP 708 zusammen, bei der Pakete Installer daran hindern können, Pakete aus unerwarteten, potenziell unsicheren Indizes zu beziehen, aber Index Priorität ist durch Endbenutzer besser konfigurierbar. Paketinstallationen sollen sich nur dann ändern, wenn entweder der Index mit höherer Priorität oder die Index-Prioritätskonfiguration geändert wird. Diese Stabilität und Vorhersagbarkeit machen es praktikabler, Indizes als eine beständigere Eigenschaft einer Umgebung zu konfigurieren, anstatt als einmaliges Argument für einen Installationsbefehl.
Cache-Schlüssel
Da Index Priorität die Möglichkeit anerkennt, dass verschiedene Indizes unterschiedliche Inhalte für ein bestimmtes Paket haben können, sollten Caching und Lockfiles nun den Index enthalten, von dem die Distributionen heruntergeladen wurden. Ohne diesen Aspekt ist es möglich, dass nach Änderung der Liste der konfigurierten Indizes der Cache oder die Lockdatei eine ähnlich benannte Distribution aus einem Index mit niedrigerer Priorität bereitstellt. Wenn jeder Index dem empfohlenen Verhalten folgt, identische Dateien über Indizes hinweg für einen bestimmten Dateinamen bereitzustellen, ist dies kein Problem. Diese Empfehlung ist jedoch nicht leicht durchsetzbar, und die Ergänzung des Cache-Schlüssels mit dem Ursprungsindex wäre eine kluge defensive Maßnahme.
Möglichkeiten, wie eine Anfrage zu einem Index mit niedrigerer Priorität durchfällt
- Paketname ist im höher priorisierten Index überhaupt nicht vorhanden
- Alle Distributionen aus dem höher priorisierten Index wurden aufgrund von Versionsspezifizierern, kompatibler Python-Version, Plattform-Tag, Yanking oder anderweitig herausgefiltert
- Eine Deny-List-Konfiguration für den Installer gibt an, dass ein bestimmter Paketname auf einem bestimmten Index ignoriert werden soll
- Ein höher priorisierter Index ist nicht erreichbar (z. B. durch Firewall-Regeln blockiert, vorübergehend wegen Wartungsarbeiten nicht verfügbar, andere diverse und temporäre Netzwerkprobleme). Dies ist ein weniger klar definiertes Detail, das von Benutzern gesteuert werden sollte. Einerseits würde dieses Verhalten zu weniger vorhersagbaren, wahrscheinlich nicht reproduzierbaren Ergebnissen führen, da unerwartet zu Indizes mit niedrigerer Priorität durchgefallen wird. Andererseits kann ein sanfter Fallback für einige Benutzer wertvoller sein, insbesondere wenn sie sicher davon ausgehen können, dass alle ihre Indizes gleichermaßen vertrauenswürdig sind. Das heutige Verhalten von pip ist ein sanfter Fallback: Sie erhalten Warnungen, wenn ein Index Verbindungsprobleme hat, aber die Installation wird mit anderen verfügbaren Indizes fortgesetzt. Da Index Priorität unterschiedliche Vertrauensstufen zwischen Indizes vermitteln kann, sollten Installer, die Index Priorität implementieren, standardmäßig Fehler auslösen und bei Netzwerkproblemen abbrechen. Installer können ein Flag bereitstellen, um bei Netzwerkfehlern den Fallback zu Indizes mit niedrigerer Priorität zu ermöglichen.
Die Behandlung innerhalb eines gegebenen Index folgt dem bestehenden Verhalten, stoppt jedoch an den Grenzen eines Index und geht erst dann zum nächsten Index über, wenn alle Prioritätspräferenzen innerhalb des einen Index erschöpft sind. Das bedeutet, dass bestehende Prioritäten innerhalb der vereinigten Sammlung von Paketen auf jeden Index einzeln angewendet werden, bevor zu einem Index mit niedrigerer Priorität durchgefallen wird.
Auf jeder Ebene der Optimierungskriterien müssen Kompromisse eingegangen werden
- Version: Index Priorität verwendet eine ältere Version aus einem Index mit höherer Priorität, auch wenn eine neuere Version in einem anderen Index verfügbar ist.
- Wheel vs. sdist: Sollte der Installer eine sdist aus einem Index mit höherer Priorität verwenden, bevor er eine Wheel aus einem Index mit niedrigerer Priorität versucht?
- Mehr plattformspezifische Wheels vor weniger spezifischen: Sollte der Installer weniger spezifische Wheels aus höher priorisierten Indizes verwenden, bevor er spezifischere Wheels aus niedriger priorisierten Indizes verwendet?
- Flags wie Pips
--prefer-binary: Sollte der Installer eine sdist aus einem Index mit höherer Priorität verwenden, bevor er Wheels in einem Index mit niedrigerer Priorität berücksichtigt?
Installer können diese Prioritäten unterschiedlich implementieren, sollten aber ihre Optimierungskriterien und die Art und Weise, wie sie den Fallback zu Indizes mit niedrigerer Priorität handhaben, dokumentieren. Ein Installer könnte zum Beispiel sagen, dass --prefer-binary keine sdist installieren sollte, es sei denn, er hat alle konfigurierten Indizes durchlaufen und keine installierbaren Binärdateikandidaten gefunden.
Mirroring
Wie bisher beschrieben, unterbricht das Index-Prioritätsschema die Verwendung von mehr als einem Index-URL, die denselben Inhalt bereitstellen. Solche Spiegel können verwendet werden, um Netzwerkprobleme zu mildern oder die Zuverlässigkeit anderweitig zu verbessern. Ein Ansatz, den Installer verfolgen könnten, um die Mirroring-Funktionalität zu erhalten und gleichzeitig die Index-Priorität hinzuzufügen, wäre die Einführung von benutzerdefinierbaren Index-Gruppen, bei denen angenommen wird, dass jeder Index in der Gruppe äquivalent ist. Dies hängt mit Poetrys Vorstellung von Paketquellen zusammen, außer dass dies eine beliebige Anzahl von priorisierbaren Gruppen ermöglichen würde und angenommen wird, dass Mitglieder einer Gruppe Spiegel sind. Innerhalb jeder Gruppe könnten Inhalte kombiniert oder jedes Mitglied gleichzeitig abgerufen werden. Der am schnellsten antwortende Index würde dann die Gruppe repräsentieren.
Abwärtskompatibilität
Dieses PEP schreibt keine Änderungen als obligatorisch für irgendeinen Installer vor, daher führt es nur zu Kompatibilitätsproblemen, wenn Tools ein Index-Verhalten wählen, das sich von dem unterscheidet, das sie derzeit implementieren.
Die Sprache dieses PEP stimmt nicht ganz mit bestehenden Tools, einschließlich pip und uv, überein. Entweder kann die Sprache dieses PEP während der Überprüfung dieses PEP geändert werden, oder wenn die Sprache dieses PEP bevorzugt wird, könnten andere Projekte sie übernehmen. Das einzige Ziel der vorgeschlagenen Begriffe ist die Schaffung eines zentralen, gemeinsamen Wortschatzes, der es Benutzern erleichtert, sich über andere Installer zu informieren.
Da einige Tools auf das eine oder andere Verhalten angewiesen sind, können einige Probleme auftreten, bei denen die Anpassung verfügbarer Ressourcen/Pakete für ein bestimmtes Verhalten die Benutzererfahrung für Personen beeinträchtigen kann, die sich auf das andere Verhalten verlassen.
- Unterschiedliche Indizes können unterschiedliche Metadaten haben. Man kann zum Beispiel nicht davon ausgehen, dass die Metadaten für das Paket „something“ im Index „A“ dieselben Abhängigkeiten haben wie „something“ im Index „B“. Dies bricht grundlegende Annahmen der Version Priorität, aber Index Priorität kann damit umgehen. Wenn ein Installer im Suchverlauf zu einem Index mit niedrigerer Priorität durchfällt, impliziert dies die Aktualisierung der Paketmetadaten aus dem neuen Index. Dies ist sowohl eine Verbesserung als auch eine Komplikation. Es ist eine Komplikation in dem Sinne, dass ein gecachter Metadateneintrag sowohl nach Paketname als auch nach Index-URL indiziert werden muss, anstatt nur nach Paketname. Es ist eine potenzielle Verbesserung, da verschiedene Implementierungsvarianten eines Pakets in den Abhängigkeiten unterschiedlich sein können, solange ihre Distributionen in verschiedene Indizes aufgeteilt sind.
- Benutzer erhalten möglicherweise nicht die erwarteten Updates bei Verwendung von Index Priorität, da ein höher priorisierter Index nicht mit PyPI aktualisiert/synchronisiert wurde, um die neuesten Pakete zu erhalten. Wenn der höher priorisierte Index einen gültigen Kandidaten hat, werden neuere Pakete nicht gefunden. Dies muss sehr ausführlich kommuniziert werden, da es dem gut etablierten Verhalten von pip widerspricht.
- Durch die Hinzufügung von Index Priorität verbessert ein Installer die Vorhersagbarkeit, welcher Index ausgewählt wird, und Index-Hosts können dies missbrauchen, indem sie ähnlich benannte Dateien mit unterschiedlichen Inhalten anbieten. Bei Version Priorität verletzt dies die entscheidende Annahme der Paket-Austauschbarkeit, und Wahnsinn wird folgen. Index Priorität wäre praktikabler, aber die Situation birgt immer noch großes Potenzial für Verwirrung. Es wäre hilfreich, Werkzeuge zu entwickeln, die Installer bei der Identifizierung dieser verwirrenden Probleme unterstützen. Diese Werkzeuge könnten unabhängig vom Installer-Prozess betrieben werden, um die Sinnhaftigkeit eines Satzes von Indizes zu validieren. Abhängig von der Zeitkosten dieser Werkzeuge könnten die Installer sie als Teil ihres Prozesses ausführen. Benutzer könnten die Empfehlungen natürlich auf eigene Gefahr ignorieren.
Sicherheitsimplikationen
Index Priorität schafft einen Mechanismus, mit dem Benutzer explizit eine Vertrauenshierarchie unter ihren Indizes angeben können. Als solche schränkt sie das Potenzial für Dependency-Confusion-Angriffe ein. Index Priorität wurde von PEP 708 als Lösung für Dependency-Confusion-Angriffe abgelehnt. Dieses PEP bittet darum, dass die Ablehnung überdacht wird, wobei Index Priorität einen anderen Zweck erfüllt. Dieses PEP wird hauptsächlich durch den Wunsch motiviert, Implementierungsvarianten zu unterstützen, was das Thema einer weiteren Diskussion ist, die hoffentlich zu einem PEP führt. Es ist nicht gegenseitig ausschließend mit PEP 708 und schlägt auch nicht vor, PEP 708 rückgängig zu machen oder zurückzuziehen. Es ist eine Antwort auf die Frage, wie Benutzer wählen können, welchen Index sie auf einer feingranulareren Ebene als „pro Installation“ verwenden möchten.
Für eine gründlichere Diskussion der Ablehnung der Index Priorität durch PEP 708 siehe den Diskussionsfaden auf discuss.python.org für dieses PEP.
Wie man das lehrt
Zu Beginn ist es nicht das Ziel, pip oder ein anderes Tool dazu zu bewegen, sein Standard-Prioritätsverhalten zu ändern. Der beste Weg zu lehren ist vielleicht, Nachrichtenforen, GitHub-Issue-Tracker und Chat-Kanäle zu beobachten und nach Problemen Ausschau zu halten, bei deren Lösung Index Priorität helfen könnte. Es gibt mehrere langjährige Diskussionen darüber wäre eine gute Ausgangsbasis, um die Konzepte zu bewerben. Die Themen der beiden offiziell unterstützten Verhaltensweisen müssen dokumentiert werden, und wir, die Autoren dieses PEP, würden diese während der Überprüfungsphase dieses PEP entwickeln. Diese Dokumentation würde wahrscheinlich Ergänzungen über mehrere Indizes umfassen, die die Konzepte zwischen den Installern verknüpfen. Mindestens erwarten wir, die PyPUG und die pip-Dokumentation zu ergänzen.
Es wird für Installer wichtig sein, das aktive Verhalten zu bewerben, insbesondere in Fehlermeldungen, und dies wird Möglichkeiten bieten, Benutzern Ressourcen zu diesen Verhaltensweisen zur Verfügung zu stellen.
uv-Benutzer erleben bereits Index Priorität. uv dokumentiert dieses Verhalten gut, aber es ist immer möglich, die Auffindbarkeit dieser Dokumentation über die Befehlszeile zu verbessern, wo Benutzer auf das unerwartete Verhalten stoßen werden.
Referenzimplementierung
Das uv-Projekt demonstriert Index Priorität mit seinem Standardverhalten. uv ist jedoch in Rust implementiert. Wenn eine Referenzimplementierung für ein Python-basiertes Tool erforderlich ist, werden wir, die Autoren dieses PEP, eine solche bereitstellen. Insbesondere für pip sehen wir den Implementierungsplan wie folgt
- Für Benutzer, die
--extra-index-urloder--find-linksnicht verwenden, wird es keine Änderung geben und keine Migration erforderlich sein. - pip-Benutzer könnten sich über eine neue Konfigurationseinstellung in der CLI und in
pip.conffür das Index-Prioritätsverhalten entscheiden. Dieser Vorschlag empfiehlt keine Strategie als Standard für irgendeinen Installer. Er empfiehlt nur die Dokumentation der Strategien, die ein Tool bereitstellt. - Zusätzliche Info-Level-Ausgabe für jede pip-Operation, bei der mehr als ein Index verwendet wird. In dieser Ausgabe geben Sie die aktuelle Strategie-Einstellung und eine knappe Zusammenfassung des impliziten Verhaltens sowie einen Link zu Dokumenten, die die verschiedenen Optionen beschreiben, an.
- Fügen Sie Debugging-Ausgaben hinzu, die den verwendeten Index bei jedem Schritt ausführlich identifizieren, einschließlich der Position der Datei in der Konfigurationshierarchie und wo sie einbezogen wird (über Konfigurationsdatei, Umgebungsvariable oder CLI-Flag).
- Verfolgen Sie die Weitergabe des verwendeten Index für jedes Paket/jede Distribution während des gesamten pip install-Prozesses. Speichern Sie diese Informationen, damit sie für Tools wie
pip freezeverfügbar sind. - Ergänzen Sie PEP 751 (Lockfiles) um die Erfassung des Index, von dem ein Paket/eine Distribution stammt.
Abgelehnte Ideen
- Weisen Sie Benutzer an, einen Proxy/Mirror einzurichten, wie z. B. devpi oder Artifactory, der lokale Dateien bereitstellt, falls vorhanden, und an einen anderen Server (PyPI) weiterleitet, wenn keine lokalen Dateien übereinstimmen.
Dies entspricht dem Verhalten dieses Vorschlags sehr genau, außer dass diese Methode das Hosten eines Servers erfordert und für Benutzer in einigen Umgebungen unzugänglich oder nicht konfigurierbar sein kann. Es ist auch wichtig zu bedenken, dass für eine Organisation, die ihren eigenen Index betreibt (z. B. zur Überwindung von PyPI-Größenbeschränkungen), dies nicht die Notwendigkeit von
--extra-index-urloder Proxy/Mirror für Endbenutzer löst. Das heißt, Organisationen erhalten keine Verbesserung durch diesen Ansatz, es sei denn, sie leiten PyPI als Ganzes über einen Proxy/Mirror und veranlassen Benutzer, ihren Proxy/Mirror als einzigen Index zu konfigurieren. - Sind Build-Tags und/oder lokale Versionsspezifizierer ausreichend?
Build-Tags und lokale Versionsspezifizierer haben Vorrang vor Paketen ohne diese Tags und/oder lokalen Versionsspezifizierer. In einem Pool von Paketen haben Builds, die diese Ergänzungen auf einem anderen Server als PyPI gehostet haben, Vorrang vor Paketen auf PyPI, die selten Build-Tags verwenden und lokale Versionsspezifizierer verbieten. Dieser Ansatz ist machbar, wenn Paket-Anbieter ihre eigenen lokalen Überschreibungen bereitstellen möchten, wie z. B. HPC-Maintainer, die optimierte Builds für ihre Benutzer bereitstellen. Er ist in gewisser Weise weniger praktikabel, da Build-Tags nicht in den Metadaten von
pip freezeangezeigt werden und lokale Versionsspezifizierer auf PyPI nicht zulässig sind. Zudem ist der Aufbau und die Wartung von Paketsammlungen mit lokalen Build-Tag-Varianten mit erheblichem Aufwand verbunden.https://discuss.python.org/t/dependency-notation-including-the-index-url/5659/21
- Was ist mit PEP 708? Ist das nicht genug?
PEP 708 zielt speziell darauf ab, Dependency-Confusion-Angriffe zu bekämpfen, und befasst sich nicht mit dem Potenzial für Implementierungsvarianten zwischen Indizes. Es ist eine Möglichkeit, externe URLs zu filtern und eine Whitelist für externe Indizes in Index-Metadaten zu kodieren. Es ändert nichts am derzeitigen Mangel an Priorität oder Präferenz zwischen Kanälen.
- Namespacing
Namespacing ist ein Mittel zur Spezifizierung eines Pakets, so dass die Python-Nutzung des Pakets unverändert bleibt, die Paketinstallation aber einschränkt, woher das Paket stammt. PEP 752 schlug kürzlich eine Möglichkeit vor, die Besitzer eines Pakets in einem flachen Paket-Namespace (z. B. PyPI) zu multiplexen, indem Präfixe als Gruppierungselemente reserviert werden. Das Konzept der „Scopes“ von NPM wurde als weiteres gutes Beispiel dafür genannt, wie dies aussehen könnte. Dieses PEP unterscheidet sich dadurch, dass es sich auf mehrere Indizes konzentriert und nicht auf einen flachen Paket-Namespace. Der Nettoeffekt ist in Bezug auf die vorhersagbare Auswahl einer bestimmten Paketquelle ungefähr derselbe, außer dass der Namespacing-Ansatz mehr auf der Benennung von Paketen mit diesen Namespace-Präfixen basiert, während dieses PEP weniger granular wäre und Pakete aus dem höher priorisierten Index zieht, den der Benutzer angibt. Der Namespacing-Ansatz setzt voraus, dass alle konfigurierten Indizes einen gegebenen Namespace ähnlich behandeln, was zu der üblichen Sorge führt, dass nicht alle konfigurierten Indizes gleichermaßen vertrauenswürdig sind. Die Namespace-Idee ist mit diesem PEP nicht unvereinbar, verbessert aber auch nicht die Ausdruck von Vertrauen in Indizes, wie es dieses PEP tut.
Offene Fragen
[Alle Punkte, die noch entschieden/diskutiert werden.]
Danksagungen
Diese Arbeit wurde finanziell von NVIDIA durch die Anstellung des Autors unterstützt. NVIDIA-Kollegen haben dieses PEP mit ihren Beiträgen dramatisch verbessert. Astral Software hat die Verhaltensweisen der Index-Priorität pionierhaft entwickelt und damit die Grundlage dieses Dokuments gelegt. Den pip-Autoren gebührt großes Lob für ihre konsequente Richtung und geduldige Kommunikation des Version-Prioritätsverhaltens, insbesondere angesichts kontroverser Sicherheitsbedenken.
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-0766.rst
Zuletzt geändert: 2024-11-21 20:00:24 GMT