PEP 470 – Entfernung der Unterstützung für externes Hosting auf PyPI
- Autor:
- Donald Stufft <donald at stufft.io>
- BDFL-Delegate:
- Paul Moore <p.f.moore at gmail.com>
- Discussions-To:
- Distutils-SIG Liste
- Status:
- Final
- Typ:
- Prozess
- Thema:
- Packaging
- Erstellt:
- 12. Mai 2014
- Post-History:
- 14. Mai 2014, 05. Juni 2014, 03. Okt 2014, 13. Okt 2014, 26. Aug 2015
- Ersetzt:
- 438
- Resolution:
- Distutils-SIG Nachricht
Inhaltsverzeichnis
- Zusammenfassung
- Begründung
- Unterstützung für mehrere Repositories/Indizes
- Außerbetriebnahme und Entfernung des Link-Spiderings
- Zusammenfassung der Änderungen
- Auswirkungen
- Häufig gestellte Fragen
- Ich kann mein Projekt nicht auf PyPI hosten wegen <X>, was soll ich tun?
- Meine Benutzer haben eine schlechtere Erfahrung mit diesem PEP als zuvor, wie erkläre ich das?
- Der Wechsel zu einer Repository-Struktur bricht meinen Workflow oder ist von meinem Hoster nicht erlaubt?
- Warum bietet ihr <X> nicht an?
- Warum sollte ich mich auf PyPI registrieren, wenn ich sowieso mein eigenes Repository betreibe?
- Abgelehnte Vorschläge
- Urheberrecht
Zusammenfassung
Dieses PEP schlägt die Außerbetriebnahme und Entfernung der Unterstützung für das Hosten von Dateien extern von PyPI sowie die Außerbetriebnahme und Entfernung der Funktionalität vor, die durch PEP 438 hinzugefügt wurde, insbesondere rel-Informationen zur Klassifizierung verschiedener Linktypen und das Meta-Tag zur Angabe der API-Version.
Begründung
Historisch gesehen hatte PyPI keine Methode zum Hosten von Dateien oder zum automatischen Abrufen von installierbaren Dateien; stattdessen konzentrierte es sich auf die Bereitstellung einer zentralen Registrierung von Namen, um Namenskollisionen zu verhindern, und als Mittel zur Entdeckung von zu verwendenden Projekten. Im Laufe der Zeit begann setuptools, diese für Menschen sichtbaren Seiten sowie die von diesen Seiten verlinkten Seiten zu scrapen, um nach Dingen zu suchen, die es automatisch herunterladen und installieren konnte. Schließlich wurde daraus die "Simple"-API, die eine ähnliche URL-Struktur verwendete, jedoch alle überflüssigen Links und Informationen eliminierte, um die API effizienter zu gestalten. Darüber hinaus entwickelte PyPI die Fähigkeit für ein Projekt, Release-Dateien direkt auf PyPI hochzuladen, was es PyPI ermöglichte, zusätzlich zu einem Index als Repository zu fungieren.
Dies gibt PyPI zwei gleich wichtige Rollen im Python-Ökosystem: die des Index zur einfachen Entdeckung von Python-Projekten und die des zentralen Repositorys zur einfachen Speicherung, zum Download und zur Installation von Python-Projekten. Aufgrund der Geschichte von PyPI und des sehr organischen Wachstums, das es erlebt hat, sind die Grenzen zwischen diesen beiden Rollen verschwommen, und diese Verschwimmung hat zu Verwirrung bei den Endbenutzern beider Rollen geführt, was wiederum zu Verärgerung zwischen Personen geführt hat, die PyPI in unterschiedlichen Kapazitäten nutzen möchten, meistens, wenn Endbenutzer PyPI als Repository nutzen möchten, der Autor jedoch PyPI ausschließlich als Index nutzen möchte.
Diese Verwirrung rührt daher, dass Endbenutzer von Projekten nicht erkennen, ob ein Projekt auf PyPI gehostet wird oder ob es auf einem externen Dienst basiert. Dies zeigt sich oft, wenn der externe Dienst ausfällt, PyPI aber nicht. Die Leute sehen, dass PyPI funktioniert und andere Projekte funktionieren, aber dieses eine spezifische funktioniert nicht. Sie erkennen oft nicht, wen sie kontaktieren müssen, um dies zu beheben, oder welche Abhilfemaßnahmen sie ergreifen können.
PEP 438 versuchte, dieses Problem zu lösen, indem es Projekten erlaubte, explizit zu deklarieren, ob sie die Repository-Funktionen nutzten oder nicht, und wenn nicht, ließ es die Installer die gefundenen Links als "intern", "verifizierbar extern" oder "nicht verifizierbar extern" klassifizieren. PEP 438 wurde akzeptiert und in pip 1.4 (veröffentlicht am 23. Juli 2013) implementiert, mit der endgültigen Umstellung in pip 1.5 (veröffentlicht am 2. Januar 2014).
PEP 438 war erfolgreich darin, mehr Leute zur Nutzung der Repository-Funktionen von PyPI zu bewegen, was insgesamt eine gute Sache ist, angesichts des globalen CDN, das PyPI antreibt und vielen Leuten Geschwindigkeitsverbesserungen bietet. Es führte jedoch zu einem neuen Punkt der Verwirrung und des Schmerzes sowohl für die Endbenutzer als auch für die Autoren.
Durch die Umstellung auf die explizite Nutzung mehrerer Repositories können wir die Grenzen zwischen diesen beiden Rollen viel deutlicher machen und die "versteckten" Überraschungen beseitigen, die sich aus der aktuellen Implementierung der Handhabung von Personen ergeben, die PyPI nicht als Repository nutzen möchten.
Wichtige Erwartungen an die Benutzererfahrung
- Externes Hosting soll "einfach funktionieren", wenn es auf System-, Benutzer- oder virtueller Umgebungsebene ordnungsgemäß konfiguriert ist.
- Alle Referenzen auf die verwirrende Unterscheidung zwischen "verifizierbar extern" und "nicht verifizierbar extern" aus der Benutzererfahrung eliminieren (sowohl bei der Installation als auch bei der Veröffentlichung von Paketen).
- Die Repository-Aspekte von PyPI sollten *nur* der standardmäßige Paket-Hosting-Standort sein (d.h. der einzige, der von den meisten Client-Tools in ihrer Standardkonfiguration als Opt-out und nicht als Opt-in behandelt wird). Abgesehen davon sollte das Hosting auf PyPI ansonsten keine verbesserte Benutzererfahrung gegenüber dem Hosting eines eigenen Paket-Repositories bieten.
- Alle oben genannten Punkte umsetzen und gleichzeitig ein Standardverhalten bieten, das gegen die meisten Angreifer unterhalb des staatsfeindlichen Niveaus sicher ist.
Warum zusätzliche Repositories?
Die beiden gängigen Installer-Tools, pip und easy_install/setuptools, unterstützen beide das Konzept von zusätzlichen Speicherorten, um nach Dateien zu suchen, die die Installationsanforderungen erfüllen, und tun dies seit vielen Jahren. Das bedeutet, dass kein neuer Flag oder kein neues Konzept "eingeführt" werden muss und die Lösung zur Installation eines Projekts aus einem anderen Repository als PyPI funktioniert, unabhängig davon, wie alt (im vernünftigen Rahmen) der Installer des Endbenutzers ist. Dieses Konzept existiert nicht nur seit einiger Zeit in den Python-Tools, sondern es ist ein Konzept, das sprachübergreifend und sogar auf Betriebssystemebene mit Betriebssystem-Pakettools existiert, die fast universell die Unterstützung mehrerer Repositories nutzen, was es extrem wahrscheinlich macht, dass jemand bereits mit dem Konzept vertraut ist.
Darüber hinaus ist der Ansatz mit mehreren Repositories ein Konzept, das außerhalb des engen Umfangs der Ermöglichung von Projekten nützlich ist, die im Index-Teil von PyPI enthalten sein sollen, aber nicht den Repository-Teil von PyPI nutzen möchten. Dazu gehören Orte, an denen ein Unternehmen ein Repository hosten möchte, das seine internen Pakete enthält, oder wo ein Projekt mehrere "Kanäle" von Releases haben möchte, wie Alpha, Beta, Release Candidate und finale Release. Dies könnte auch für Projekte verwendet werden, die Dateien hosten möchten, die nicht auf PyPI hochgeladen werden können, wie z. B. Multi-Gigabyte-Datendateien oder derzeit Linux Wheels.
Warum nicht PEP 438 oder Ähnliches?
Während die Unterstützung für zusätzliche Suchorte in pip und setuptools schon seit geraumer Zeit besteht, existiert die Unterstützung für PEP 438 nur in pip seit Version 1.4 und wurde in setuptools noch nicht implementiert. Das Design von PEP 438 bedeutete, dass Benutzer immer noch von Projekten profitierten, die keine externen Dateien benötigten, selbst mit älteren Installern. Für Projekte, die jedoch externe Dateien *benötigten*, erhielten die Benutzer immer noch stillschweigend potenziell unzuverlässige oder, noch schlimmer, unsichere Dateien zum Herunterladen. Dieses System ist auch einzigartig für Python, da es aus der Geschichte von PyPI resultiert. Das bedeutet, dass dieses Konzept für die meisten, wenn nicht alle Benutzer fast sicher fremd sein wird, bis sie es bei der Verwendung der Python-Toolchain antreffen.
Darüber hinaus hat sich das von PEP 438 vorgeschlagene Klassifizierungssystem in der Praxis als extrem verwirrend für Endbenutzer erwiesen, so sehr, dass es die Position dieses PEP ist, dass die Situation, wie sie ist, völlig unhaltbar ist. Das übliche Muster für einen Benutzer mit diesem System ist, zu versuchen, ein Projekt zu installieren, möglicherweise eine Fehlermeldung zu erhalten (oder vielleicht auch nicht, wenn das Projekt jemals etwas auf PyPI hochgeladen hat, dann aber wechselte, ohne alte Dateien zu entfernen), zu sehen, dass die Fehlermeldung `--allow-external` vorschlägt, die Befehlszeile erneut auszuführen und dieses Flag hinzuzufügen, höchstwahrscheinlich eine weitere Fehlermeldung zu erhalten, zu sehen, dass die Fehlermeldung diesmal vorschlägt, auch `--allow-unverified` hinzuzufügen, und die Befehlszeile zum dritten Mal auszuführen, um endlich das zu erhalten, was sie installieren möchten.
Dieses UX-Versagen existiert aus mehreren Gründen.
- Wenn pip Dateien für ein Projekt über die Simple API finden kann, wird es diese einfach verwenden, anstatt zu versuchen, mehr zu finden. Dies ist im Allgemeinen das Richtige, da der Versuch, mehr zu finden, einen großen Teil des Nutzens von PEP 438 zunichtemachen würde. Das bedeutet, dass, wenn ein Projekt jemals eine Datei hochgeladen hat, die dem vom Benutzer angeforderten Installationsmaterial entspricht, diese verwendet wird, unabhängig davon, wie alt sie ist.
- PEP 438 geht von der Annahme aus, dass die meisten Projekte sich entweder auf PyPI hochladen oder sich aktualisieren, um direkt auf Release-Dateien zu verlinken. Während sich eine große Anzahl von Projekten letztendlich für den Upload auf PyPI entschied, taten dies einige von ihnen nur, weil die Benutzererfahrung rund um PEP 438 so schlecht war, dass sie sich dazu gezwungen fühlten. Besorgniserregender ist jedoch, dass sich nur sehr wenige Projekte dafür entschieden haben, direkt und sicher auf Dateien zu verlinken, und stattdessen immer noch einfach auf Seiten verlinken, die gescrapt werden müssen, um die eigentlichen Dateien zu finden, wodurch die sichere Variante (`--allow-external`) weitgehend nutzlos wird.
- Selbst wenn ein Autor direkt auf seine Dateien verlinken möchte, ist dies nicht offensichtlich. Es erfordert die Einbeziehung eines MD5-Hash (aus historischen Gründen) in den Hash der URL. Wenn er diesen nicht einfügt, werden seine Dateien als "nicht verifiziert" betrachtet.
- PEP 438 verfolgt einen sicherheitszentrierten Ansatz und verbietet jede Form eines globalen Opt-in für nicht verifizierte Projekte. Das ist zwar im Allgemeinen gut, führt aber zu extrem wortreichen und sich wiederholenden Befehlaufrufen wie
$ pip install --allow-external myproject --allow-unverified myproject myproject $ pip install --allow-all-external --allow-unverified myproject myproject
Unterstützung für mehrere Repositories/Indizes
Installer SOLLTEN die Möglichkeit implementieren oder weiterhin anbieten, den Installer auf mehrere URL-Speicherorte zu verweisen. Die genauen Mechanismen, mit denen ein Benutzer angibt, dass er einen zusätzlichen Speicherort verwenden möchte, überlässt es jeder einzelnen Implementierung.
Zusätzlich obliegt der Mechanismus zur Entdeckung eines Installationskandidaten, wenn mehrere Repositories verwendet werden, jeder einzelnen Implementierung. Sobald konfiguriert, sollte eine Implementierung die Verwendung eines Repositorys jedoch nicht entmutigen, warnen oder anderweitig negativ beleuchten, nur weil es nicht das Standard-Repository ist.
Derzeit implementieren sowohl pip als auch setuptools die Unterstützung für mehrere Repositories, indem sie den besten Installationskandidaten verwenden, den sie aus einem der Repositories finden können, und ihn im Wesentlichen so behandeln, als wäre es ein einziges großes Repository.
Installer SOLLTEN auch einen Mechanismus implementieren, um die Verwendung des Standard-Repositorys zu entfernen oder anderweitig zu deaktivieren. Die genauen Details, wie dies erreicht wird, überlässt es jeder einzelnen Implementierung.
Installer SOLLTEN auch einen Mechanismus implementieren, um zu whitelisten und zu blacklisten, welche Projekte ein Benutzer aus einem bestimmten Repository installieren möchte. Die genauen Details, wie dies erreicht wird, überlässt es jeder einzelnen Implementierung.
Der Python Packaging Guide MUSS mit einem Abschnitt aktualisiert werden, der die Optionen für die Einrichtung ihres eigenen Repositorys detailliert beschreibt, sodass jedes Projekt, das in Zukunft nicht auf PyPI hosten möchte, auf diese Dokumentation verweisen kann. Dies sollte den Vorschlag beinhalten, dass Projekte, die auf dem Hosting ihrer eigenen Repositories basieren, in ihrer Projektbeschreibung dokumentieren, wie ihr Projekt installiert werden kann.
Außerbetriebnahme und Entfernung des Link-Spiderings
Ein neuer Hosting-Modus wird zu PyPI hinzugefügt. Dieser Hosting-Modus wird `pypi-only` genannt und wird zusätzlich zu den drei Modi hinzugefügt, die PEP 438 uns bereits gegeben hat: `pypi-explicit`, `pypi-scrape`, `pypi-scrape-crawl`. Dieser neue Hosting-Modus wird die Simple-API-Seite eines Projekts so modifizieren, dass nur die Dateien aufgelistet werden, die direkt auf PyPI gehostet werden, und nichts anderes verlinkt wird.
Nach der Annahme dieses PEP und der Hinzufügung des `pypi-only`-Modus werden alle neuen Projekte standardmäßig auf den PyPI-only-Modus gesetzt und sind an diesen Modus gebunden und können diese bestimmte Einstellung nicht ändern.
Anschließend wird eine E-Mail an alle Projekte gesendet, die ausschließlich auf PyPI gehostet werden, und sie darüber informiert, dass ihr Projekt in einem Monat automatisch in den `pypi-only`-Modus konvertiert wird. Einen Monat nach dem Versand dieser E-Mails werden alle Projekte, die die E-Mail erhalten haben und immer noch ausschließlich auf PyPI gehostet werden, dauerhaft auf den `pypi-only`-Modus gesetzt.
Gleichzeitig wird eine E-Mail an Projekte gesendet, die auf externes Hosting angewiesen sind. Diese E-Mail wird diese Projekte warnen, dass extern gehostete Dateien auf PyPI außer Betrieb genommen wurden und dass in 3 Monaten nach dem Versand dieser E-Mail alle externen Links aus den Installer-APIs entfernt werden. Diese E-Mail **MUSS** Anweisungen zur Konvertierung ihrer Projekte zur Hosterstellung auf PyPI enthalten und **MUSS** Links zu einem Skript oder Paket enthalten, das es ihnen ermöglicht, ihre PyPI-Anmeldeinformationen und ihren Paketnamen einzugeben, damit alle ihre Dateien automatisch heruntergeladen und erneut auf PyPI gehostet werden. Diese E-Mail **MUSS** auch Anweisungen zur Einrichtung ihrer eigenen Indexseite enthalten. Diese E-Mail muss auch einen Link zu den Nutzungsbedingungen von PyPI enthalten, da viele Benutzer sich möglicherweise vor langer Zeit angemeldet haben und sich möglicherweise nicht mehr an die Bedingungen erinnern. Schließlich muss diese E-Mail eine Liste der mit PyPI registrierten Links enthalten, bei denen wir feststellen konnten, dass eine installierbare Datei vorhanden war.
Zwei Monate nach der ersten E-Mail wird eine weitere E-Mail an alle Projekte gesendet, die immer noch auf externes Hosting angewiesen sind. Diese E-Mail wird alle Informationen enthalten, die die erste E-Mail enthielt, mit der Ausnahme, dass das Entfernungsdatum nur noch einen Monat statt drei Monate entfernt ist.
Schließlich werden alle Projekte einen Monat später in den `pypi-only`-Modus umgeschaltet und PyPI wird so modifiziert, dass die Funktionalität für extern verlinkte Dateien entfernt wird.
Zusammenfassung der Änderungen
Repository-Seite
- Außerbetriebnahme und Entfernung der durch PEP 438 definierten Hosting-Modi.
- Beschränken Sie die Simple API so, dass nur die im Repository enthaltenen Dateien aufgelistet werden.
Client-Seite
- Implementieren Sie die Unterstützung für mehrere Repositories.
- Implementieren Sie einen Mechanismus zum Entfernen/Deaktivieren des Standard-Repositorys.
- Außerbetriebnahme / Entfernung von PEP 438
Auswirkungen
Um die Auswirkungen zu bestimmen, haben wir alle Projekte untersucht, die eine Methode zur Suche auf PyPI verwenden, die der von pip und setuptools ähnelt, und nach allen Dateien gesucht, die auf PyPI verfügbar sind, sicher von PyPI verlinkt, unsicher von PyPI verlinkt und schließlich außerhalb von PyPI unsicher verfügbar sind. Wenn dieselbe Datei an mehreren Stellen gefunden wurde, wurde sie dedupliziert und nur an einem Ort basierend auf den folgenden Präferenzen gezählt: PyPI > Sicher außerhalb von PyPI > Unsicher außerhalb von PyPI. Dies gibt uns die breitest mögliche Definition der Auswirkungen. Es bedeutet, dass jede einzelne Datei für dieses Projekt standardmäßig nicht mehr sichtbar sein könnte, aber diese Datei könnte Jahre alt sein, oder sie könnte eine Binärdatei sein, während auf PyPI eine sdist verfügbar ist. Das bedeutet, dass die *tatsächlichen* Auswirkungen wahrscheinlich viel geringer sein werden, aber in dem Bemühen, keine Fehlzählung vorzunehmen, nehmen wir die breitest mögliche Definition.
Zum Zeitpunkt der Abfassung dieses Textes gibt es 65.232 Projekte, die auf PyPI gehostet werden. Davon sind 59 auf externe Dateien angewiesen, die sicher außerhalb von PyPI gehostet werden, und 931 sind auf externe Dateien angewiesen, die unsicher außerhalb von PyPI gehostet werden. Dies zeigt uns, dass 1,5 % der Projekte auf irgendeine Weise von dieser Änderung betroffen sein werden, während 98,5 % weiterhin wie bisher funktionieren werden. Darüber hinaus nutzen nur 5 % der betroffenen Projekte die von PEP 438 bereitgestellten Funktionen, um sicher außerhalb von PyPI zu hosten, während 95 % ihrer Benutzer Remote Code Execution durch einen Man-in-the-Middle-Angriff aussetzen.
Häufig gestellte Fragen
Ich kann mein Projekt nicht auf PyPI hosten wegen <X>, was soll ich tun?
Zuerst sollten Sie entscheiden, ob <X> etwas ist, das PyPI inhärent ist, oder ob PyPI eine Funktion entwickeln könnte, um <X> für Sie zu lösen. Wenn PyPI eine Funktion hinzufügen kann, die es Ihnen ermöglicht, Ihr Projekt auf PyPI zu hosten, dann sollten Sie diese Funktion vorschlagen. Wenn <X> jedoch etwas ist, das PyPI inhärent ist, wie z. B. die Kontrolle über Ihre eigenen Dateien behalten zu wollen, dann sollten Sie Ihr eigenes Paket-Repository einrichten und Ihre Benutzer in der Projektbeschreibung anweisen, es zur Liste der Repositories hinzuzufügen, die ihr bevorzugter Installer verwenden soll.
Meine Benutzer haben eine schlechtere Erfahrung mit diesem PEP als zuvor, wie erkläre ich das?
Ein Teil dieser Antwort wird projektspezifisch sein. Sie müssen Ihren Benutzern erklären, warum Sie sich entschieden haben, in Ihrem eigenen Repository zu hosten, anstatt eines zu verwenden, das bereits in der Standardliste der Repositories ihres Installers enthalten ist. Ein Teil dieser Antwort wird jedoch auch erklären, dass das frühere Verhalten der transparenten Einbeziehung externer Links sowohl eine Sicherheitsgefahr darstellte (da es in den meisten Fällen einem MITM erlaubte, beliebigen Python-Code auf dem Rechner des Endbenutzers auszuführen) als auch ein Zuverlässigkeitsproblem darstellte und dass PEP 438 versuchte, dies zu lösen, indem er sie explizit zur Zustimmung zwang, aber dass PEP 438 eine Reihe schwerwiegender Usability-Probleme mit sich brachte. PEP 470 stellt eine Vereinfachung des Modells auf ein Modell dar, mit dem viele Benutzer vertraut sein werden, das bei Linux-Distributionen üblich ist.
Der Wechsel zu einer Repository-Struktur bricht meinen Workflow oder ist von meinem Hoster nicht erlaubt?
Es gibt eine Reihe von günstigen oder kostenlosen Hostern, die das, was für ein Repository erforderlich ist, gerne unterstützen würden. Insbesondere müssen Sie Ihre Dateien nicht tatsächlich anderswo hochladen, solange Sie einen Host mit der richtigen Struktur generieren können, der auf die tatsächlichen Speicherorte Ihrer Dateien verweist. Viele dieser Hoster bieten kostenloses HTTPS über einen gemeinsamen Domainnamen an, und kostenlose HTTPS-Zertifikate können von StartSSL oder in naher Zukunft von LetsEncrypt bezogen werden, oder sie können günstig von einer beliebigen Anzahl von Anbietern bezogen werden.
Warum bietet ihr <X> nicht an?
Die Antwort hierauf hängt davon ab, was <X> ist, aber die Antworten lauten typischerweise:
- Wir hatten nicht daran gedacht und niemand hatte es vorher vorgeschlagen.
- Wir haben nicht genügend Erfahrung mit <X>, um eine Lösung dafür richtig zu entwickeln, und würden uns über einen Domänenexperten freuen, der uns bei der Bereitstellung hilft.
- Wir sind ein Open-Source-Projekt und niemand hat sich entschieden, <X> zu entwerfen und zu implementieren.
Zusätzliche PEPs zur Vorstellung weiterer Funktionen sind immer willkommen, allerdings müssten sie jemanden mit der Zeit und Expertise enthalten, um <X> genau zu entwerfen. Dieses spezielle PEP zielt darauf ab, uns zu einem Punkt zu bringen, an dem die Fähigkeiten von PyPI klar und verständlich sind und einem leicht verständlichen Grundgerüst ähneln, das bestehenden Modellen wie Linux-Distributions-Repositories ähnelt.
Warum sollte ich mich auf PyPI registrieren, wenn ich sowieso mein eigenes Repository betreibe?
PyPI erfüllt zwei kritische Funktionen für das Python-Ökosystem. Eine davon ist die als zentrales Repository für die tatsächlichen Dateien, die von pip oder einem anderen Paketmanager heruntergeladen und installiert werden, und es ist diese Funktion, die dieses PEP betrifft und die Sie ersetzen würden, wenn Sie Ihr eigenes Repository betreiben. Sie bietet jedoch auch eine zentrale Registrierung, wer welche Namen besitzt, um Namenskollisionen zu verhindern. Betrachten Sie es quasi als DNS, aber für Python-Pakete. Neben der Sicherstellung, dass Namen nach dem Prinzip "Wer zuerst kommt, mahlt zuerst" vergeben werden, bietet sie auch einen einzigen Ort, an den sich Benutzer wenden können, um neue Projekte zu suchen und zu entdecken. Die einfache Antwort lautet also: Sie sollten Ihr Projekt immer noch bei PyPI registrieren, um Namenskollisionen zu vermeiden und sicherzustellen, dass die Leute Ihr Projekt immer noch leicht entdecken können.
Abgelehnte Vorschläge
Ermöglichen Sie eine einfachere Entdeckung von extern gehosteten Indizes
Eine frühere Version dieses PEP enthielt eine neue Funktion, die sowohl PyPI als auch Installern hinzugefügt wurde und es Projektentwicklern ermöglichen würde, eine Liste von URLs in PyPI einzugeben, die Installer anweisen würden, alle auf PyPI hochgeladenen Dateien zu ignorieren und stattdessen einen Fehler zurückzugeben, der den Endbenutzer über diese zusätzlichen URLs informiert, die er zu seinem Installer hinzufügen kann, um die Installation zu ermöglichen.
Diese Funktion wurde aus dem Umfang des PEP entfernt, da es sich als zu schwierig erwies, eine Lösung zu entwickeln, die UX-Probleme vermied, ähnlich denen, die mit der Lösung von PEP 438 so viele Probleme verursachten. Bei Bedarf könnte ein zukünftiges PEP diese Idee erneut aufgreifen.
Behalten Sie das aktuelle Klassifizierungssystem bei, passen Sie jedoch die Optionen an
Dieses PEP lehnt mehrere verwandte Vorschläge ab, die versuchen, einige der Usability-Probleme mit dem aktuellen System zu beheben, aber dennoch den allgemeinen Kern von PEP 438 beizubehalten.
Dazu gehören
- Standardmäßig sicher extern gehostete Dateien zulassen, aber unsicher gehostete verbieten.
- Standardmäßig sicher extern gehostete Dateien verbieten, mit nur einem globalen Flag, um sie zu aktivieren, aber unsicher gehostete verbieten.
- Dem empfohlenen Weg von PEP 438 folgen und die Option für unsicheres externes Hosting entfernen, aber weiterhin die Option für sicheres externes Hosting zulassen.
Diese Vorschläge werden abgelehnt, weil
- Das in PEP 438 eingeführte Klassifizierungssystem ist ein völlig einzigartiges Konzept für PyPI, das selbst im Kontext des Python-Paketmanagements nicht allgemein anwendbar ist. Das Hinzufügen weiterer Konzepte hat seinen Preis.
- Das Klassifizierungssystem selbst ist nicht offensichtlich zu erklären, und um vorherzubestimmen, welche Klassifizierung ein Projekt erfordert, muss die `/simple/<project>/`-Seite des Projekts und möglicherweise alle von dieser Seite verlinkten URLs inspiziert werden.
- Die Möglichkeit, extern zu hosten und trotzdem für die automatische Entdeckung verlinkt zu werden, ist hauptsächlich ein historisches Relikt, das viel Schmerz und Komplexität bei geringem Nutzen verursacht.
- Die Fähigkeit des Installers, die Benutzeroberfläche zu optimieren oder aufzuräumen, ist aufgrund der impliziten Link-Scraping, die durchgeführt werden müsste, begrenzt. Dies erstreckt sich auch auf die `--allow-*`-Optionen sowie auf die Unfähigkeit, festzustellen, ob ein Link voraussichtlich fehlschlägt oder nicht.
- Der Mechanismus verwendet eine sehr breite Bürste, wenn eine Option aktiviert wird, während PEP 438 versucht, dies mit Paketspezifischen Optionen einzuschränken. Ein seit langer Zeit bestehendes Projekt kann jedoch oft mehrere verschiedene URLs in seinem einfachen Index haben. Es ist nicht ungewöhnlich, dass mindestens eine davon nicht mehr unter der Kontrolle des Projekts steht. Während eine nicht registrierte Domäne meist harmlos bleibt, wird pip bei jeder Entdeckungsphase weiterhin versuchen, von ihr zu installieren. Das bedeutet, dass ein Angreifer lediglich nach Projekten suchen muss, die unsichere externe URLs verwenden, und abgelaufene Domains registrieren muss, um Benutzer anzugreifen.
Implementieren Sie dieses PEP, aber entfernen Sie nicht die bestehenden Links
Dies ist im Wesentlichen die abwärtskompatible Version dieses PEP. Es wird versucht, Personen, die ältere Clients oder Clients verwenden, die dieses PEP nicht implementieren, weiterhin so zu behandeln, als ob sich nichts geändert hätte. Dieser Vorschlag wird abgelehnt, da die überwiegende Mehrheit dieser Szenarien unsichere Verwendungen der außer Betrieb genommenen Funktionen sind. Es ist die Meinung dieses PEP, dass das stille Zulassen von unsicheren Aktionen im Namen von Endbenutzern einfach keine akzeptable Lösung ist.
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0470.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT