Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 710 – Aufzeichnung der Herkunft installierter Pakete

Autor:
Fridolín Pokorný <fridolin.pokorny at gmail.com>
Sponsor:
Donald Stufft <donald at stufft.io>
PEP-Delegate:
Paul Moore <p.f.moore at gmail.com>
Discussions-To:
Discourse thread
Status:
Entwurf
Typ:
Standards Track
Thema:
Packaging
Erstellt:
27-Mrz-2023
Post-History:
03-Dez-2021, 30-Jan-2023, 14-Mär-2023, 03-Apr-2023

Inhaltsverzeichnis

Zusammenfassung

Dieser PEP beschreibt eine Methode zur Aufzeichnung der Herkunft installierter Python-Distributionen. Der Datensatz wird von einem Installer erstellt und steht Benutzern in Form einer JSON-Datei provenance_url.json im Verzeichnis .dist-info zur Verfügung. Die genannte JSON-Datei erfasst zusätzliche Metadaten, um die Aufzeichnung einer URL zu einem Distributionspaket zusammen mit dem Hash der installierten Distribution zu ermöglichen. Dieser Vorschlag baut auf PEP 610 auf, folgt seiner entsprechenden kanonischen PyPA-Spezifikation und ergänzt direct_url.json mit provenance_url.json für Fälle, in denen Pakete durch einen Namen und optional eine Version identifiziert werden.

Motivation

Die Installation eines Python-Projekts beinhaltet das Herunterladen eines Distributionspakets von einem Paketindex und das Extrahieren seines Inhalts an einen geeigneten Ort. Nach Abschluss des Installationsprozesses gehen Informationen über das verwendete Release-Artefakt und seine Quelle im Allgemeinen verloren. Es gibt jedoch Anwendungsfälle, um Aufzeichnungen der für die Installation von Paketen verwendeten Distributionen und ihrer Herkunft aufzubewahren.

Python-Wheels können mit unterschiedlichen Compiler-Flags erstellt werden oder verschiedene Wheel-Tags unterstützen. In beiden Fällen können Benutzer in eine Situation geraten, in der mehrere Wheels von Installern (möglicherweise aus verschiedenen Paketindizes) berücksichtigt werden könnten und es hilfreich wäre, sofort herauszufinden, welche Wheel-Datei tatsächlich während der Installation verwendet wurde. Auf diese Weise können Entwickler Informationen über Wheels verwenden, um Probleme zu debuggen und sicherzustellen, dass das gewünschte Wheel tatsächlich installiert wurde. Ein weiterer Anwendungsfall könnten Werkzeuge sein, die installierte Software berichten, wie z. B. Werkzeuge, die eine SBOM (Software Bill of Materials) berichten, die genauere Berichte liefern könnten. Ein weiterer Anwendungsfall könnte die Rekonstruktion der Python-Umgebung sein, indem jedes installierte Paket an ein bestimmtes Distributionsartefakt angeheftet wird, das aus einem Python-Paketindex bezogen wurde.

Begründung

Die in diesem PEP beschriebene Motivation ist eine Erweiterung der Spezifikation Recording the Direct URL Origin of installed distributions. Zusätzlich zur Aufzeichnung von Herkunftsinformationen für Pakete, die über eine direkte URL installiert wurden, sollten Installer dies auch für Pakete tun, die nach Namen (und optional nach Version) aus Python-Paketindizes installiert werden.

Die in diesem PEP beschriebene Idee hat ihren Ursprung in einem Tool namens micropipenv, das zur Installation von Distributionspaketen in containerisierten Umgebungen verwendet wird (siehe gemeldete Issue thoth-station/micropipenv#206). Derzeit trägt die zusammengestellte containerisierte Anwendung nicht implizit Informationen über die Herkunft installierter Distributionspakete (es sei denn, diese werden von vollständigen URLs installiert und über direct_url.json erfasst). Dies erfordert, dass Lieferanten von Container-Images Container-Images mit dem entsprechenden Build-Prozess, seiner Konfiguration und dem Anwendungscod verknüpfen, um Anforderungsdateien zu prüfen, wenn Software in containerisierten Umgebungen geprüft werden muss.

Die anschließende Diskussion im Discourse-Thread brachte auch die neue Option --report von pip zur Sprache, die einen detaillierten JSON-Bericht über den Installationsprozess generieren kann. Diese Option könnte bei dem Herkunftsproblem helfen, das dieser PEP behandelt. Nichtsdestotrotz muss diese Option *explizit* an pip übergeben werden, um die Herkunftsinformationen zu erhalten, und sie enthält zusätzliche Metadaten, die für die Prüfung der Herkunft möglicherweise nicht notwendig sind (wie z. B. Python-Versionsanforderungen jedes Distributionspakets). Außerdem ist diese Option zum Zeitpunkt der Erstellung dieses PEP spezifisch für pip.

Beachten Sie, dass die aktuelle Spezifikation für die Aufzeichnung installierter Pakete eine RECORD-Datei definiert, die installierte Dateien aufzeichnet, aber nicht das Distributionsartefakt, von dem diese Dateien bezogen wurden. Die Prüfung installierter Artefakte kann auf der Grundlage von Übereinstimmungen mit den Einträgen in der RECORD-Datei erfolgen. Diese Technik erfordert jedoch eine vorab erstellte Datenbank von Dateien, die jedes Artefakt bereitstellt, oder einen Vergleich mit dem tatsächlichen Artefaktinhalt. Beide Ansätze sind relativ teure und zeitaufwändige Operationen, die mit der vorgeschlagenen Datei provenance_url.json eliminiert werden könnten.

Die Aufzeichnung von Herkunftsinformationen für installierte Distributionspakete, sowohl die von direkten URLs als auch die nach Namen/Version aus einem Index bezogenen, kann die Prüfung von Python-Umgebungen im Allgemeinen vereinfachen, über den spezifischen Anwendungsfall für containerisierte Anwendungen hinaus. Ein Community-Projekt pip-audit hat sein mögliches Interesse in pypa/pip-audit#170 geäußert.

Spezifikation

Die Schlüsselwörter „MUST“, „MUST NOT“, „REQUIRED“, „SHOULD“, „SHOULD NOT“, „RECOMMENDED“, „MAY“ und „OPTIONAL“ in diesem Dokument sind wie in RFC 2119 beschrieben zu interpretieren.

Die Datei provenance_url.json SOLLTE im Verzeichnis .dist-info von Installern erstellt werden, wenn ein Distributionspaket, das nach Namen (und optional nach Versionsspezifizierer) angegeben ist, installiert wird.

Diese Datei DARF NICHT erstellt werden, wenn ein Distributionspaket aus einer Anforderung installiert wird, die eine direkte URL-Referenz (einschließlich einer VCS-URL) angibt.

Nur eine der Dateien provenance_url.json und direct_url.json (aus der Spezifikation Recording the Direct URL Origin of installed distributions und der entsprechenden Spezifikation der Direct URL Data Structure) darf in einem gegebenen Verzeichnis .dist-info vorhanden sein; Installer DÜRFEN NICHT beide hinzufügen.

Die JSON-Datei provenance_url.json MUSS ein Dictionary sein, das mit RFC 8259 konform und UTF-8-kodiert ist.

Falls vorhanden, MUSS sie genau zwei Schlüssel enthalten. Der erste MUSS url vom Typ string sein. Der zweite Schlüssel MUSS archive_info sein, mit einem unten definierten Wert.

Der Wert des Schlüssels url MUSS die URL sein, von der das Distributionspaket heruntergeladen wurde. Wenn ein Wheel aus einer Quellverteilung gebaut wird, MUSS der url-Wert die URL sein, von der die Quellverteilung heruntergeladen wurde. Wenn ein Wheel direkt heruntergeladen und installiert wird, MUSS das Feld url die URL sein, von der das Wheel heruntergeladen wurde. Wie in der Spezifikation Direct URL Data Structure muss der url-Wert aus Sicherheitsgründen von jeglichen sensiblen Authentifizierungsinformationen bereinigt werden.

Der Benutzer:Passwort-Teil der URL KANN jedoch aus Umgebungsvariablen bestehen, die dem folgenden regulären Ausdruck entsprechen

\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?

Zusätzlich KANN der Benutzer:Passwort-Teil der URL eine bekannte, nicht sicherheitsrelevante Zeichenkette sein. Ein typisches Beispiel ist git im Falle einer URL wie ssh://git@gitlab.com.

Der Wert von archive_info MUSS ein Dictionary mit einem einzigen Schlüssel hashes sein. Der Wert von hashes ist ein Dictionary, das Hash-Funktionsnamen auf einen hex-kodierten Digest der Datei abbildet, auf die der url-Wert verweist. Mindestens ein Hash MUSS aufgezeichnet werden. Mehrere Hashes KÖNNEN enthalten sein, und es liegt am Konsumenten, zu entscheiden, was mit mehreren Hashes geschehen soll (er kann sie alle oder eine Teilmenge davon validieren oder gar nichts).

Jeder Hash MUSS einer der einargumentigen Hashes sein, die von hashlib.algorithms_guaranteed bereitgestellt werden, mit Ausnahme von sha1 und md5, die NICHT verwendet werden dürfen. Ab Python 3.11 sind mit Ausnahme von shake_128 und shake_256 für Mehrfachargumente die erlaubten Hashes:

>>> import hashlib
>>> sorted(hashlib.algorithms_guaranteed - {"shake_128", "shake_256", "sha1", "md5"})
['blake2b', 'blake2s', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512']

Jeder Hash MUSS unter dem kanonischen Namen des Hashs, immer in Kleinbuchstaben, referenziert werden.

Hashes sha1 und md5 DÜRFEN NICHT vorhanden sein, aufgrund der Sicherheitsbeschränkungen dieser Hash-Algorithmen. Umgekehrt SOLLTE der Hash sha256 enthalten sein.

Installer, die Distributionspakete aus einem Index cachen, SOLLTEN Informationen über das gecachte Distributionsartefakt beibehalten, damit die Datei provenance_url.json auch beim Installieren von Distributionspaketen aus dem Cache des Installers erstellt werden kann.

Abwärtskompatibilität

Gemäß der Spezifikation Recording installed projects können Installer zusätzliche, spezifische Dateien im Verzeichnis .dist-info speichern. Um sicherzustellen, dass dieser PEP keine Rückwärtskompatibilitätsprobleme verursacht, fand eine umfassende Umfrage von Installern und Bibliotheken keine aktuellen Tools, die eine ähnlich benannte Datei verwenden, oder andere wesentliche Machbarkeitsprobleme.

Die Spezifikation Wheel specification listet Dateien auf, die im Verzeichnis .dist-info vorhanden sein können. Keine dieser Dateinamen kollidiert mit der vorgeschlagenen Datei provenance_url.json aus diesem PEP.

Vorhandensein von provenance_url.json in Installern und Bibliotheken

Eine umfassende Umfrage der vorhandenen Installer, Bibliotheken und Abhängigkeitsmanager im Python-Ökosystem analysierte die Auswirkungen der Hinzufügung der Unterstützung für provenance_url.json zu jedem Werkzeug. Zusammenfassend wurden zum Zeitpunkt der Erstellung dieses PEP keine wesentlichen Rückwärtskompatibilitätsprobleme, Konflikte oder Machbarkeitshindernisse festgestellt. Weitere Details zur Umfrage finden Sie im Abschnitt Anhang: Umfrage von Installern und Bibliotheken.

Kompatibilität mit direct_url.json

Dieser Vorschlag ändert nichts an der Datei direct_url.json, die in PEP 610 und seiner entsprechenden kanonischen PyPA-Spezifikation beschrieben wird.

Der Inhalt der Datei provenance_url.json wurde so konzipiert, dass Installer schließlich einige der Logik wiederverwenden können, die direct_url.json unterstützt, wenn eine direkte URL auf ein Quellarchiv oder ein Wheel verweist.

Der Hauptunterschied zwischen den Dateien provenance_url.json und direct_url.json sind die obligatorischen Schlüssel und ihre Werte in der Datei provenance_url.json. Dies stellt sicher, dass Konsumenten der Datei provenance_url.json sich auf ihren Inhalt verlassen können, wenn die Datei im Verzeichnis .dist-info vorhanden ist.

Sicherheitsimplikationen

Eines der Hauptsicherheitsmerkmale der Datei provenance_url.json ist die Möglichkeit, installierte Artefakte in Python-Umgebungen zu überprüfen. Tools können überprüfen, welche Python-Paketindizes zum Installieren von Python-Distributionspaketen verwendet wurden, sowie die Hash-Digests ihrer Release-Artefakte.

Als Beispiel können wir die kürzlich kompromittierte Abhängigkeitskette im PyTorch-Vorfall nehmen. Der PyTorch-Index stellte ein Paket namens torchtriton bereit. Ein Angreifer veröffentlichte torchtriton auf PyPI, das eine bösartige Binärdatei ausführte. Durch die Überprüfung der in der Datei provenance_url.json angegebenen URL der installierten Python-Distribution können Tools die Quelle der installierten Python-Distribution automatisch überprüfen. Im Fall des PyTorch-Vorfalls sollte die URL von torchtriton auf den PyTorch-Index und nicht auf PyPI verweisen. Tools können helfen, solche installierten bösartigen Python-Distributionen zu identifizieren, indem sie die URL der installierten Python-Distribution überprüfen. Eine genauere Prüfung kann auch den Hash der installierten Python-Distribution umfassen, der in der Datei provenance_url.json angegeben ist. Solche Hash-Prüfungen können für gespiegelte Python-Paketindizes hilfreich sein, bei denen Python-Distributionen nicht anhand ihrer Quell-URLs unterscheidbar sind, und stellen sicher, dass nur die gewünschten Python-Paketdistributionen installiert werden.

Ein böswilliger Akteur kann den Inhalt von provenance_url.json absichtlich anpassen, um möglicherweise die Herkunftsinformationen der installierten Python-Distribution zu verbergen. Eine Sicherheitsprüfung, die solche bösartigen Aktivitäten aufdecken würde, liegt außerhalb des Rahmens dieses PEP, da sie die Überwachung von Dateisystemaktivitäten und die anschließende Überprüfung von Benutzer- oder Dateiberechtigungen erfordern würde.

Wie man das lehrt

Die Metadaten-Datei provenance_url.json ist für Tools gedacht und für Endbenutzer nicht direkt sichtbar.

Beispiele

Beispiele für eine gültige provenance_url.json

Eine gültige provenance_url.json listet mehrere Hashes

{
  "archive_info": {
    "hashes": {
      "blake2s": "fffeaf3d0bd71dc960ca2113af890a2f2198f2466f8cd58ce4b77c1fc54601ff",
      "sha256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f",
      "sha3_256": "c856930e0f707266d30e5b48c667a843d45e79bb30473c464e92dfa158285eab",
      "sha512": "6bad5536c30a0b2d5905318a1592948929fbac9baf3bcf2e7faeaf90f445f82bc2b656d0a89070d8a6a9395761f4793c83187bd640c64b2656a112b5be41f73d"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

Eine gültige provenance_url.json, die einen einzelnen Hash-Eintrag auflistet

{
  "archive_info": {
    "hashes": {
      "sha256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

Eine gültige provenance_url.json, die eine Quellverteilung auflistet, die zur Erstellung und Installation eines Wheels verwendet wurde

{
  "archive_info": {
    "hashes": {
      "sha256": "8bfe29f17c10e2f2e619de8033a07a224058d96b3bfe2ed61777596f7ffd7fa9"
    }
  },
  "url": "https://files.pythonhosted.org/packages/1d/43/ad8ae671de795ec2eafd86515ef9842ab68455009d864c058d0c3dcf680d/micropipenv-0.0.1.tar.gz"
}

Beispiele für eine ungültige provenance_url.json

Das folgende Beispiel enthält einen hash-Schlüssel im archive_info-Dictionary, wie ursprünglich in der Datenstruktur dokumentiert, die in Recording the Direct URL Origin of installed distributions beschrieben ist. Der hash-Schlüssel darf NICHT vorhanden sein, um Verwechslungen mit hashes und zusätzlichen Prüfungen, die erforderlich wären, um die Hash-Werte synchron zu halten, zu vermeiden.

{
  "archive_info": {
    "hash": "sha256=236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f",
    "hashes": {
      "sha256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

Ein weiteres Beispiel zeigt einen ungültigen Hash-Namen. Der referenzierte Hash-Name entspricht nicht den kanonischen Hash-Namen, die in diesem PEP und in den Python-Dokumenten unter hashlib.hash.name beschrieben sind.

{
  "archive_info": {
    "hashes": {
      "SHA-256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

Das letzte Beispiel zeigt eine provenance_url.json-Datei ohne verfügbare Hashes für das heruntergeladene Artefakt

{
  "archive_info": {
    "hashes": {}
   }
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

Beispiele für pip-Befehle und deren Auswirkungen auf provenance_url.json und direct_url.json

Diese Befehle generieren eine direct_url.json-Datei, aber keine provenance_url.json-Datei. Diese Beispiele folgen den Beispielen aus der Spezifikation Direct URL Data Structure.

  • pip install https://example.com/app-1.0.tgz
  • pip install https://example.com/app-1.0.whl
  • pip install "git+https://example.com/repo/app.git#egg=app&subdirectory=setup"
  • pip install ./app
  • pip install file:///home/user/app
  • pip install --editable "git+https://example.com/repo/app.git#egg=app&subdirectory=setup" (in diesem Fall wird url das lokale Verzeichnis sein, in das das Git-Repository geklont wurde, und dir_info wird mit "editable": true und ohne vcs_info vorhanden sein)
  • pip install -e ./app

Befehle, die eine provenance_url.json-Datei generieren, aber keine direct_url.json-Datei

  • pip install app
  • pip install app~=2.2.0
  • pip install app --no-index --find-links "https://example.com/"

Dieses Verhalten kann mit Änderungen an pip, die im PR pypa/pip#11865 implementiert wurden, getestet werden.

Referenzimplementierung

Ein Proof-of-Concept zur Erstellung der Metadaten-Datei provenance_url.json bei der Installation eines Python-Distributionspakets ist im PR zu pip pypa/pip#11865 verfügbar. Er nutzt die bereits vorhandene Implementierung für die direct URL data structure, um die Metadaten-Datei provenance_url.json für Fälle bereitzustellen, in denen direct_url.json nicht erstellt wird.

Eine Referenzimplementierung zur Unterstützung der Datei provenance_url.json in PDM existiert im PR pdm-project/pdm#3013.

Ein Prototyp namens pip-preserve wurde entwickelt, um die Erstellung von requirements.txt-Dateien unter Berücksichtigung der Metadaten-Dateien direct_url.json und provenance_url.json zu demonstrieren. Dieses Tool imitiert die Funktionalität von pip freeze, aber die Auflistung der installierten Pakete enthält auch die Hashes der Python-Distributionsartefakte.

Zur weiteren Unterstützung dieses Vorschlags demonstriert pip-sbom die Erstellung von SBOMs im SPDX-Format. Das Tool verwendet Informationen aus der Datei provenance_url.json.

Abgelehnte Ideen

Benennung der Datei direct_url.json anstelle von provenance_url.json

Um die Rückwärtskompatibilität mit Recording the Direct URL Origin of installed distributions zu wahren, kann die Datei nicht direct_url.json heißen, gemäß dem Text dieser Spezifikation.

Diese Datei DARF NICHT erstellt werden, wenn eine Distribution aus einem anderen Anforderungstyp installiert wird (d. h. Name plus Versionsspezifizierer).

Eine solche Änderung könnte Rückwärtskompatibilitätsprobleme für Konsumenten von direct_url.json einführen, die sich auf ihre Anwesenheit nur dann verlassen, wenn Distributionen über eine direkte URL-Referenz installiert werden.

Deprecating direct_url.json und ausschließliche Verwendung von provenance_url.json

Die Datei direct_url.json ist bereits durch die Spezifikation Direct URL Data Structure etabliert und wird bereits von Installern verwendet. Zum Beispiel verwendet pip direct_url.json, um eine direkte URL-Referenz in pip freeze zu melden. Das Deprecating von direct_url.json würde zusätzliche Änderungen an der pip freeze-Implementierung in pip erfordern (siehe PR fridex/pip#2) und könnte Rückwärtskompatibilitätsprobleme für bereits vorhandene direct_url.json-Konsumenten verursachen.

Beibehaltung des Hash-Schlüssels im archive_info-Dictionary

Die Spezifikation Direct URL Data Structure diskutiert die Möglichkeit, den Schlüssel hash neben dem Schlüssel hashes im archive_info-Dictionary einzuschließen. Dieser PEP schließt ausdrücklich den Schlüssel hash nicht in die Datei provenance_url.json ein und erlaubt nur die Anwesenheit des Schlüssels hashes. Dadurch vermeiden wir mögliche Redundanz in der Datei, mögliche Verwechslungen und zusätzliche Prüfungen, die durchgeführt werden müssten, um sicherzustellen, dass die Hashes synchron sind.

Zulassen keiner angegebenen Hashes

Für Fälle, in denen eine Wheel-Datei aus dem Cache von pip installiert und mit einer älteren Version von pip gebaut wird, speichert pip keine Hashes der heruntergeladenen Quellverteilungen. Da wir keine Hashes dieser heruntergeladenen Quellverteilungen haben, würde der Schlüssel hashes in der Datei provenance_url.json keine Einträge enthalten. In solchen Fällen erstellt pip keine provenance_url.json-Datei, da die Herkunftsinformationen nicht vollständig sind. Es wird empfohlen, dass Konsumenten Wheels in diesen Fällen mit einer neueren pip-Version neu erstellen.

uv-Entwickler äußerten Bedenken hinsichtlich der Anforderung mindestens eines Hashes in der Datei provenance_url.json, da uv keine Distributions-Hashes berechnet, es sei denn, dies wird explizit verlangt. Die Anforderung mindestens eines Hashes hilft jedoch bei Integritätsprüfungen für Distributionen. Dies ist wichtig in Szenarien, die Lock-Dateien betreffen oder wenn Distributionen als Teil von SBOMs identifiziert werden. Die Datei provenance_url.json erfordert die Aufnahme mindestens eines Hashes für die heruntergeladene Distribution. Installer, die keine Hashes von Distributionen als Teil des Installationsprozesses berechnen (z. B. aus Leistungsgründen), können die Erstellung der Datei provenance_url.json unterlassen.

Optionales Machen des hashes-Schlüssels

PEP 610 und seine entsprechende kanonische PyPA-Spezifikation empfehlen die Einbeziehung des Schlüssels hashes des archive_info in der Datei direct_url.json, aber dies ist nicht zwingend erforderlich (gemäß der RFC 2119-Sprache).

Ein Hashes-Schlüssel SOLLTE als Dictionary vorhanden sein, das einen Hash-Namen auf einen hex-kodierten Digest der Datei abbildet.

Dieser PEP verlangt, dass der Schlüssel hashes im archive_info in der Datei provenance_url.json enthalten ist, wenn diese Datei erstellt wird; gemäß diesem PEP

Der Wert von archive_info MUSS ein Dictionary mit einem einzigen Schlüssel hashes sein.

Dadurch können Konsumenten von provenance_url.json Artefakt-Digests überprüfen, wenn die Datei provenance_url.json von Installern erstellt wird.

Speichern der Index-URL

Es wurde die Möglichkeit angesprochen, die Index-URL als Teil des Dateiinhalts zu speichern. Diese Index-URL würde den in der pip-Konfiguration konfigurierten Index darstellen oder mit den Optionen --index-url oder --extra-index-url angegeben werden. Das Speichern dieser Information wurde als verwirrend empfunden, insbesondere bei der Verwendung anderer Installationsoptionen wie --find-links. Da die tatsächliche Index-URL nicht strikt an den Speicherort gebunden ist, von dem die Wheel-Datei heruntergeladen wurde, haben wir uns entschieden, die Index-URL nicht in der Datei provenance_url.json zu speichern.

Offene Fragen

Verfügbarkeit der Datei provenance_url.json in Conda

Wir bitten um Feedback zur provenance_url.json-Datei von den Conda-Maintainern. Es ist nicht klar, ob Conda die provenance_url.json-Datei übernehmen möchte. Conda speichert bereits herkunftsbezogene Informationen (ähnlich den in diesem PEP vorgeschlagenen Herkunftsinformationen) in JSON-Dateien im Verzeichnis conda-meta gemäß seinen Aktionen während der Installation.

Verwendung von provenance_url.json in nachgelagerten Installern

Die vorgeschlagene Datei provenance_url.json sollte primär von Python-Installern übernommen werden. Andere Installer, wie APT oder DNF, könnten die Herkunft der installierten nachgelagerten Python-Distributionen auf ihre eigene, für das nachgelagerte Paketmanagement spezifische Weise aufzeichnen. Die vorgeschlagene Datei wird nicht von diesen nachgelagerten Paketinstallern erstellt und wurde daher absichtlich von diesem PEP ausgenommen. Jegliches Input von Entwicklern oder Maintainern dieser Installer ist jedoch wertvoll, um die Datei provenance_url.json möglicherweise mit Informationen anzureichern, die in irgendeiner Weise hilfreich wären.

Anhang: Umfrage von Installern und Bibliotheken

pip

Die Funktion aus der internen API von pip, die für die Installation von Wheels zuständig ist und _install_wheel heißt, speichert keine provenance_url.json-Datei im Verzeichnis .dist-info. Darüber hinaus demonstriert ein Prototyp, der die genannte Datei in pip in pypa/pip#11865 einführt, die Einbindung von Logik zur Handhabung der provenance_url.json-Datei in den Quellcode von pip.

Da pip von einigen der unten genannten Tools zur Installation von Python-Paketdistributionen verwendet wird, gelten die Ergebnisse für pip auch für diese Tools, und pip erlaubt keine Parametrisierung der Erstellung von Dateien im Verzeichnis .dist-info in seiner internen API. Die meisten der unten genannten Tools, die pip als Subprozess aufrufen, haben keinen Einfluss auf das endgültige Vorhandensein der provenance_url.json-Datei im Verzeichnis .dist-info.

distlib

distlib implementiert Low-Level-Funktionalität zur Manipulation des Verzeichnisses dist-info. Die Datenbank der installierten Distributionen verwendet keine Datei namens provenance_url.json, basierend auf dem Quellcode von distlib.

Pipenv

Pipenv verwendet pip zur Installation von Python-Paketdistributionen. Es wurden keine zusätzlichen Logiken identifiziert, die zu Rückwärtskompatibilitätsproblemen führen würden, wenn die Datei provenance_url.json im Verzeichnis .dist-info eingeführt wird.

installer

installer erstellt keine provenance_url.json Datei explizit. Dennoch erlaubt installer gemäß der Recording Installed Projects-Spezifikation, das Argument additional_metadata zu übergeben, um eine Datei im .dist-info Verzeichnis zu erstellen – siehe den Quellcode. Um Rückwärtskompatibilitätsprobleme zu vermeiden, darf keine Bibliothek oder kein Werkzeug, das installer verwendet, das Erstellen der provenance_url.json Datei über das erwähnte additional_metadata Argument anfordern.

Poetry

Die Installationslogik in Poetry hängt von der Konfigurationsoption installer.modern-installer ab (siehe Doku).

Wenn die Konfigurationsoption installer.modern-installer auf false gesetzt ist, verwendet Poetry pip für die Installation von Python-Paketverteilungen.

Wenn die Konfigurationsoption installer.modern-installer auf true gesetzt ist, verwendet Poetry installer zur Installation von Python-Paketverteilungen. Wie aus den verlinkten Quellen ersichtlich ist, wird keine zusätzliche Metadatendatei namens provenance_url.json übergeben, die Kompatibilitätsprobleme mit diesem PEP verursachen würde.

Conda

Conda erstellt keine provenance_url.json Datei bei der Installation von Python-Paketverteilungen.

Hatch

Hatch verwendet pip zur Installation von ProjektDependencies.

micropipenv

Da micropipenv ein Wrapper um pip ist, verwendet es pip zur Installation von Python-Verteilungen, sowohl für Lock-Dateien als auch für Requirements-Dateien.

Thamos

Thamos verwendet micropipenv zur Installation von Python-Paketverteilungen, daher gelten alle Erkenntnisse für micropipenv auch für Thamos.

PDM

PDM verwendet installer zur Installation von Binärverteilungen. Die einzige zusätzliche Metadatendatei, die es schließlich im .dist-info Verzeichnis erstellt, ist die REFER_TO-Datei.

uv

uv ist in Rust geschrieben und verwendet seine eigene Installationslogik bei der Installation von Wheels. Es erstellt keine zusätzlichen Dateien im .dist-info Verzeichnis, die mit dem Dateinamen provenance_url.json kollidieren würden.

Danksagungen

Vielen Dank an Dustin Ingram, Brett Cannon und Paul Moore für die anfängliche Diskussion, aus der diese Idee entstanden ist.

Vielen Dank an Donald Stufft, Ofek Lev und Trishank Kuppusamy für frühes Feedback und Unterstützung bei der Arbeit an diesem PEP.

Vielen Dank an Gregory P. Smith, Stéphane Bidoul, C.A.M. Gerlach und Adam Turner für die Überprüfung dieses PEP und die wertvollen Vorschläge.

Vielen Dank an Seth Michael Larson für die Unterstützung, wertvolle Vorschläge und den vorgeschlagenen pip-sbom-Prototyp.

Vielen Dank an Stéphane Bidoul und Chris Jerdonek für PEP 610 und die zugehörigen Spezifikationen Recording the Direct URL Origin of installed distributions und Direct URL Data Structure.

Vielen Dank an Frost Ming für die Anregung möglicher Bedenken bezüglich der Speicherung der Index-URL in der provenance_url.json Datei und die anfängliche Unterstützung für PEP 710 in PDM.

Vielen Dank an Charlie Marsh und Zanie Blue für die Beiträge im Zusammenhang mit dem uv-Installer.

Zu guter Letzt, aber nicht unwichtig, vielen Dank an Donald Stufft für die Förderung dieses PEP.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0710.rst

Zuletzt geändert: 2025-07-06 09:23:40 GMT