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

Python Enhancement Proposals

PEP 639 – Verbesserung der Lizenzklarheit durch bessere Paketmetadaten

Autor:
Philippe Ombredanne <pombredanne at nexb.com>, C.A.M. Gerlach <CAM.Gerlach at Gerlach.CAM>, Karolina Surma <karolina.surma at gazeta.pl>
PEP-Delegate:
Brett Cannon <brett at python.org>
Discussions-To:
Discourse thread
Status:
Final
Typ:
Standards Track
Thema:
Packaging
Erstellt:
15-Aug-2019
Post-History:
15-Aug-2019, 17-Dez-2021, 10-Mai-2024
Resolution:
Discourse-Nachricht

Inhaltsverzeichnis

Wichtig

Dieses PEP ist ein historisches Dokument. Die aktuelle, kanonische Spezifikation, Kernmetadatenspezifikationen, wird auf der PyPA Specs-Seite gepflegt.

×

Siehe den PyPA-Spezifikations-Update-Prozess, um Änderungen vorzuschlagen.

Zusammenfassung

Diese PEP definiert eine Spezifikation, wie Lizenzen in Python-Projekten dokumentiert werden.

Zu diesem Zweck

Dies wird die Lizenzdeklaration für Paketautoren einfacher und weniger mehrdeutig machen, für Endbenutzer verständlicher und für Werkzeuge programmatisch verarbeitbar.

Die Änderungen aktualisieren die Spezifikation der Kernmetadaten auf Version 2.4.

Ziele

Der Umfang dieser PEP beschränkt sich auf die Abdeckung neuer Mechanismen zur Dokumentation der Lizenz eines Distributionspakets, insbesondere durch die Definition von

Die von dieser PEP geforderten Änderungen wurden entwickelt, um die Auswirkungen zu minimieren und die Abwärtskompatibilität zu maximieren.

Nicht-Ziele

Diese PEP empfiehlt keinen bestimmten Lizenztyp, der von einem bestimmten Paketautor gewählt werden sollte.

Wenn Projekte sich entscheiden, die neuen Felder nicht zu verwenden, werden durch diese PEP keine zusätzlichen Einschränkungen beim Hochladen auf PyPI auferlegt.

Diese PEP befasst sich auch nicht mit der Lizenzdokumentation einzelner Dateien, obwohl dies ein untersuchter Bereich in einem Anhang ist, noch beabsichtigt sie, Fälle abzudecken, in denen die Quellverteilung und die Binärverteilung keine gleichen Lizenzen haben.

Motivation

Software muss lizenziert sein, damit andere als ihr Ersteller sie herunterladen, verwenden, teilen und ändern können. Heute gibt es mehrere Felder, in denen Lizenzen in Kernmetadaten dokumentiert werden, und es gibt Einschränkungen, was in jedem von ihnen ausgedrückt werden kann. Dies führt oft zu Verwirrung sowohl bei Paketautoren als auch bei Endbenutzern, einschließlich der für die Distribution zuständigen Wiederverpacker.

Dies hat eine Reihe von Lizenzdiskussionen und Problemen ausgelöst, unter anderem zu veralteten und mehrdeutigen PyPI-Klassifikatoren, Lizenzinteroperabilität mit anderen Ökosystemen, zu viele verwirrende Lizenzmetadatenoptionen, begrenzte Unterstützung für Lizenzdateien im Wheel-Projekt und dem Mangel an präzisen Lizenzmetadaten.

Infolgedessen weisen Python-Pakete im Durchschnitt tendenziell mehr mehrdeutige und fehlende Lizenzinformationen auf als andere gängige Ökosysteme. Dies wird durch die Statistikseite des ClearlyDefined-Projekts unterstützt, eine Initiative der Open Source Initiative zur Verbesserung der Lizenzklarheit anderer FOSS-Projekte, die alle Pakete von PyPI, Maven, npm und Rubygems abdeckt.

Die aktuellen Lizenzklassifikatoren könnten erweitert werden, um die gesamte Bandbreite der SPDX-Bezeichner abzudecken, während die mehrdeutigen Klassifikatoren (wie z.B. License :: OSI Approved :: BSD License) als veraltet markiert werden.

Es gibt jedoch mehrere Argumente gegen einen solchen Ansatz

  • Es erfordert einen erheblichen Aufwand, die SPDX-Lizenzliste zu duplizieren und synchron zu halten.
  • Es ist ein harter Bruch der Abwärtskompatibilität, der Paketautoren zwingt, auf neue Klassifikatoren zu aktualisieren, sobald PyPI die alten als veraltet markiert.
  • Es deckt nur Pakete unter einer einzelnen Lizenz ab; es behandelt keine Projekte, die Abhängigkeiten bündeln (z.B. Setuptools), eine Lizenzauswahl anbieten (z.B. Packaging) oder neu lizenziert wurden, Code aus anderen Projekten adaptieren oder Schriften, Bilder, Beispiele, Binärdateien oder andere Inhalte unter anderen Lizenzen enthalten.
  • Es erfordert, dass sowohl Autoren als auch Werkzeuge das PyPI-spezifische Klassifikatoren-System verstehen und implementieren.
  • Es gibt keinen so klaren Hinweis darauf, dass ein Paket das neue System übernommen hat und entsprechend behandelt werden sollte.

Begründung

Eine Umfrage wurde durchgeführt, um die bestehenden Lizenzmetadatendefinitionen im Python-Ökosystem und in einer Vielzahl von anderen Paketsystemen, Linux-Distributionen, Sprachökosystemen und Anwendungen abzubilden.

Die Ergebnisse der Umfrage haben die Empfehlungen dieser PEP geleitet

  • SPDX- und SPDX-ähnliche Syntaxen sind die beliebtesten Lizenz-Ausdrücke in vielen modernen Paketsystemen.
  • Die meisten Free- and Open-Source-Software-Lizenzen verlangen von Paketautoren, ihren vollständigen Text in einem Distributionspaket einzufügen.

Daher führt diese PEP zwei neue Kernmetadatenfelder ein

  • License-Expression, das eine eindeutige Möglichkeit bietet, die Lizenz eines Pakets mithilfe von SPDX-Lizenz-Ausdrücken anzugeben.
  • License-File, das eine standardisierte Methode bietet, den vollständigen Text der Lizenz(en) mit dem Paket bei der Verteilung einzufügen und anderen Werkzeugen, die die Kernmetadaten konsumieren, das Auffinden der Lizenzdateien eines Distributionsarchivs ermöglicht.

Darüber hinaus baut diese Spezifikation auf bestehenden Praktiken in den Projekten Setuptools und Wheel auf. Eine aktuelle Version des Entwurfs dieser PEP ist im Packagging-Tool Hatch implementiert, und ein früherer Entwurf des Teils über Lizenzdateien ist in Setuptools implementiert.

Terminologie

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.

Lizenzbedingungen

Die lizenzbezogene Terminologie entstammt stark dem SPDX-Projekt, insbesondere den Begriffen Lizenz-Bezeichner und Lizenz-Ausdruck.

Lizenzklassifikator
Ein PyPI Trove-Klassifikator (wie in der Spezifikation der Kernmetadaten beschrieben), der mit License :: beginnt.
Lizenz-Ausdruck
SPDX-Ausdruck
Eine Zeichenkette mit gültiger SPDX-Lizenz-Ausdrucks-Syntax, die einen oder mehrere SPDX-Lizenz-Bezeichner enthält und die Lizenz(en) eines Projekts und deren Beziehungen beschreibt. Beispiele: GPL-3.0-or-later, MIT AND (Apache-2.0 OR BSD-2-clause)
Lizenz-Bezeichner
SPDX-Bezeichner
Ein gültiger SPDX-Kurzform-Lizenz-Bezeichner, wie im Abschnitt Feld License-Expression hinzufügen dieser PEP beschrieben. Dazu gehören alle gültigen SPDX-Bezeichner und die benutzerdefinierten Zeichenketten LicenseRef-[idstring], die der SPDX-Spezifikation, Klausel 10.1 der gegebenen Spezifikation Version, entsprechen. Beispiele: MIT, GPL-3.0-only, LicenseRef-My-Custom-License
Stamm-Lizenzverzeichnis
Lizenzverzeichnis
Das Verzeichnis, unter dem Lizenzdateien in einem Projekt-Quellbaum, Distributionsarchiv oder installierten Projekt gespeichert sind. Ebenso das Stammverzeichnis, auf das sich ihre Pfade im License-File Kernmetadatenfeld relativ beziehen. Definiert als das Projektstammverzeichnis für einen Projekt-Quellbaum oder eine Quellverteilung; und ein Unterverzeichnis namens licenses des Verzeichnisses, das die erstellten Metadaten enthält – d.h. das Verzeichnis .dist-info/licenses – für eine erstellte Verteilung oder ein installiertes Projekt.

Spezifikation

Die notwendigen Änderungen zur Implementierung dieser PEP umfassen

Beachten Sie, dass die Anleitung zu Fehlern und Warnungen für das Standardverhalten von Werkzeugen gilt; sie KÖNNEN strenger agieren, wenn Benutzer sie explizit dazu konfigurieren, z.B. über ein CLI-Flag oder eine Konfigurationsoption.

SPDX-Lizenz-Ausdruck-Syntax

Diese PEP übernimmt die SPDX-Lizenz-Ausdrucks-Syntax, wie in der SPDX-Spezifikation, entweder Version 2.2 oder einer späteren kompatiblen Version, dokumentiert.

Ein Lizenz-Ausdruck kann die folgenden Lizenz-Bezeichner verwenden

  • Alle SPDX-gelisteten Lizenz-Kurzform-Bezeichner, die in der SPDX License List, Version 3.17 oder einer späteren kompatiblen Version veröffentlicht werden. Beachten Sie, dass die SPDX-Arbeitsgruppe niemals Lizenz-Bezeichner entfernt; stattdessen kann sie einen Bezeichner als „veraltet“ markieren.
  • Die benutzerdefinierten Zeichenketten LicenseRef-[idstring], wobei [idstring] eine eindeutige Zeichenkette ist, die Buchstaben, Zahlen, . und/oder - enthält, um Lizenzen zu identifizieren, die nicht in der SPDX-Lizenzliste enthalten sind. Die benutzerdefinierten Bezeichner müssen der SPDX-Spezifikation, Klausel 10.1 der jeweiligen Spezifikationsversion, folgen.

Beispiele für gültige SPDX-Ausdrücke

MIT
BSD-3-Clause
MIT AND (Apache-2.0 OR BSD-2-Clause)
MIT OR GPL-2.0-or-later OR (FSFUL AND BSD-2-Clause)
GPL-3.0-only WITH Classpath-Exception-2.0 OR BSD-3-Clause
LicenseRef-Special-License OR CC0-1.0 OR Unlicense
LicenseRef-Proprietary

Beispiele für ungültige SPDX-Ausdrücke

Use-it-after-midnight
Apache-2.0 OR 2-BSD-Clause
LicenseRef-License with spaces
LicenseRef-License_with_underscores

Kernmetadaten

Die Fehlermeldungs- und Warnungsanleitung in diesem Abschnitt gilt für Build- und Veröffentlichungswerkzeuge; installationsorientierte Werkzeuge für Endbenutzer KÖNNEN weniger streng sein als hier erwähnt, wenn sie fehlerhafte Metadaten vorfinden, die nicht dieser Spezifikation entsprechen.

Da neue Felder hinzugefügt werden, aktualisiert diese PEP die Version der Kernmetadaten auf 2.4.

Feld License-Expression hinzufügen

Das optionale Kernmetadatenfeld License-Expression ist so spezifiziert, dass es eine Textzeichenkette enthält, die ein gültiger SPDX Lizenz-Ausdruck ist, wie oben definiert.

Build- und Veröffentlichungswerkzeuge SOLLTEN prüfen, ob das Feld License-Expression einen gültigen SPDX-Ausdruck enthält, einschließlich der Gültigkeit der einzelnen Lizenz-Bezeichner (wie oben definiert). Werkzeuge KÖNNEN die Ausführung abbrechen und einen Fehler auslösen, wenn ein ungültiger Ausdruck gefunden wird. Wenn Werkzeuge den SPDX-Ausdruck validieren, SOLLTEN sie auch eine fallnormalisierte Version des Feldes License-Expression unter Verwendung der Referenzfallform für jeden SPDX-Lizenz-Bezeichner und Großbuchstaben für die Schlüsselwörter AND, OR und WITH speichern. Werkzeuge SOLLTEN eine Warnung ausgeben und Veröffentlichungswerkzeuge KÖNNEN einen Fehler auslösen, wenn ein oder mehrere Lizenz-Bezeichner in der SPDX License List als veraltet markiert wurden.

Für alle neu hochgeladenen Distributionsarchive, die ein Feld License-Expression enthalten, MUSS das Python Package Index (PyPI) validieren, dass sie einen gültigen, fallnormalisierten Lizenz-Ausdruck mit gültigen Bezeichnern (wie oben definiert) enthalten, und MUSS Uploads ablehnen, die dies nicht tun. Benutzerdefinierte Lizenz-Bezeichner, die der SPDX-Spezifikation entsprechen, gelten als gültig. PyPI KANN einen Upload ablehnen, wenn ein veralteter Lizenz-Bezeichner verwendet wird, sofern dieser seit der oben genannten Version der SPDX-Lizenzliste veraltet ist.

Feld License-File hinzufügen

License-File ist ein optionales Kernmetadatenfeld. Jede Instanz enthält die Zeichenkettendarstellung des Pfades einer lizenzbezogenen Datei. Der Pfad befindet sich innerhalb des Projekt-Quellbaums, relativ zum Projektstammverzeichnis. Es ist ein Feld für mehrere Verwendungen, das null- oder mehrmals vorkommen kann, und jede Instanz listet den Pfad zu einer solchen Datei auf. Dateien, die unter diesem Feld angegeben sind, können Lizenztexte, Autoren-/Attributionsinformationen oder andere rechtliche Hinweise enthalten, die mit dem Paket verteilt werden müssen.

Wie in dieser PEP spezifiziert, ist sein Wert auch der Pfad dieser Datei relativ zum Stamm-Lizenzverzeichnis sowohl in installierten Projekten als auch in den standardisierten Distributionspaket-Typen.

Wenn eine License-File in den Kernmetadaten einer Quellverteilung oder erstellten Verteilung aufgeführt ist

  • Diese Datei MUSS im Distributionsarchiv unter dem angegebenen Pfad relativ zum Stamm-Lizenzverzeichnis enthalten sein.
  • Diese Datei MUSS mit dem Projekt unter demselben relativen Pfad installiert werden.
  • Der angegebene relative Pfad MUSS konsistent zwischen Projekt-Quellbäumen, Quellverteilungen (sdists), erstellten Verteilungen (Wheels) und installierten Projekten sein.
  • Innerhalb des Stamm-Lizenzverzeichnisses MÜSSEN Paketwerkzeuge die Verzeichnisstruktur reproduzieren, unter der sich die Quelllizenzdateien relativ zum Projektstamm befinden.
  • Pfadtrennzeichen MÜSSEN der Schrägstrich (/) sein, und übergeordnete Verzeichnisindikatoren (..) DÜRFEN NICHT verwendet werden.
  • Der Inhalt von Lizenzdateien MUSS UTF-8-kodierter Text sein.

Build-Werkzeuge KÖNNEN und Veröffentlichungswerkzeuge SOLLTEN eine informative Warnung ausgeben, wenn die Metadaten einer erstellten Verteilung keine License-File-Einträge enthalten, und Veröffentlichungswerkzeuge KÖNNEN, aber Build-Werkzeuge DÜRFEN KEINEN Fehler auslösen.

Für alle neu hochgeladenen Distributionsarchive, die ein oder mehrere Felder License-File in ihren Kernmetadaten enthalten und eine Metadata-Version von 2.4 oder höher deklarieren, SOLLTE PyPI validieren, dass alle angegebenen Dateien in diesen Distributionsarchiven vorhanden sind, und MUSS Uploads ablehnen, die nicht validieren.

Feld License als veraltet markieren

Das Legacy-Freitext-Feld License als Kernmetadatenfeld ist veraltet und wird durch das neue Feld License-Expression ersetzt. Die Felder sind gegenseitig ausschließend. Werkzeuge, die Kernmetadaten generieren, DÜRFEN nicht beide Felder erstellen. Werkzeuge, die Kernmetadaten lesen, MÜSSEN, wenn beide Felder gleichzeitig vorhanden sind, den Wert von License-Expression lesen und den Wert des Feldes License ignorieren.

Wenn nur das Feld License vorhanden ist, KÖNNEN Werkzeuge eine Warnung ausgeben, die Benutzer darüber informiert, dass es veraltet ist und License-Expression empfiehlt.

Für alle neu hochgeladenen Distributionsarchive, die ein Feld License-Expression enthalten, MUSS das Python Package Index (PyPI) solche ablehnen, die sowohl die Felder License als auch License-Expression angeben.

Das Feld License kann in einer zukünftigen PEP aus einer neuen Version der Spezifikation entfernt werden.

Lizenzklassifikatoren als veraltet markieren

Die Verwendung von Lizenzklassifikatoren im Feld Classifier Kernmetadatenfeld (wie in der Spezifikation der Kernmetadaten beschrieben) ist veraltet und wird durch das präzisere Feld License-Expression ersetzt.

Wenn das Feld License-Expression vorhanden ist, KÖNNEN Build-Werkzeuge einen Fehler auslösen, wenn ein oder mehrere Lizenzklassifikatoren in einem Feld Classifier enthalten sind, und DÜRFEN solche Klassifikatoren nicht selbst hinzufügen.

Andernfalls, wenn dieses Feld einen Lizenzklassifikator enthält, KÖNNEN Werkzeuge eine Warnung ausgeben, die Benutzer darüber informiert, dass solche Klassifikatoren veraltet sind und License-Expression empfohlen wird. Zur Kompatibilität mit bestehenden Veröffentlichungs- und Installationsprozessen sollte die Anwesenheit von Lizenzklassifikatoren keinen Fehler auslösen, es sei denn, License-Expression ist ebenfalls vorhanden.

Neue Lizenzklassifikatoren DÜRFEN NICHT zu PyPI hinzugefügt werden; Benutzer, die sie benötigen, SOLLTEN stattdessen das Feld License-Expression verwenden. Lizenzklassifikatoren können in einer zukünftigen PEP aus einer neuen Version der Spezifikation entfernt werden.

Projektquellmetadaten

Diese PEP spezifiziert Änderungen an den Projektquellmetadaten unter einer Tabelle [project] in der Datei pyproject.toml.

Zeichenkettenwert zum Schlüssel license hinzufügen

Der Schlüssel license in der Tabelle [project] ist so definiert, dass er einen Zeichenkettenwert auf oberster Ebene enthält. Es handelt sich um einen gültigen SPDX-Lizenz-Ausdruck, wie in dieser PEP definiert. Sein Wert entspricht dem Feld License-Expression in den Kernmetadaten.

Build-Werkzeuge SOLLTEN den Ausdruck validieren und fallnormalisieren, wie im Abschnitt Feld License-Expression hinzufügen beschrieben, und eine Fehlermeldung oder Warnung wie angegeben ausgeben.

Beispiele

[project]
license = "MIT"

[project]
license = "MIT AND (Apache-2.0 OR BSD-2-clause)"

[project]
license = "MIT OR GPL-2.0-or-later OR (FSFUL AND BSD-2-Clause)"

[project]
license = "LicenseRef-Proprietary"

Schlüssel license-files hinzufügen

Ein neuer Schlüssel license-files wird zur Tabelle [project] hinzugefügt, um Pfade im Projekt-Quellbaum relativ zu pyproject.toml zu Dateien anzugeben, die Lizenzen und andere rechtliche Hinweise enthalten, die mit dem Paket verteilt werden sollen. Er entspricht den Feldern License-File in den Kernmetadaten.

Sein Wert ist ein Array von Zeichenketten, das gültige Glob-Muster enthalten MUSS, wie nachstehend spezifiziert

  • Alphanumerische Zeichen, Unterstriche (_), Bindestriche (-) und Punkte (.) MÜSSEN wortwörtlich übereinstimmen.
  • Spezielle Glob-Zeichen: *, ?, ** und Zeichenbereiche: [], die nur die wortwörtlich übereinstimmenden Zeichen enthalten, MÜSSEN unterstützt werden. Innerhalb von [...] kennzeichnet der Bindestrich einen lokalitätsunabhängigen Bereich (z.B. a-z, Reihenfolge basierend auf Unicode-Codepunkten). Bindestriche am Anfang oder Ende werden buchstäblich abgeglichen.
  • Pfadtrennzeichen MÜSSEN der Schrägstrich (/) sein. Muster sind relativ zum Verzeichnis, das pyproject.toml enthält, daher darf das führende Schrägstrichzeichen NICHT verwendet werden.
  • Elternverzeichnisindikatoren (..) DÜRFEN NICHT verwendet werden.

Alle Zeichen oder Zeichensequenzen, die nicht von dieser Spezifikation abgedeckt sind, sind ungültig. Projekte DÜRFEN solche Werte NICHT verwenden. Tools, die dieses Feld verarbeiten, SOLLTEN ungültige Werte mit einem Fehler ablehnen.

Tools MÜSSEN davon ausgehen, dass der Inhalt von Lizenzdateien gültiger UTF-8-kodierter Text ist, und SOLLTEN dies validieren und einen Fehler auslösen, wenn dies nicht der Fall ist.

Literalpfade (z. B. LICENSE) werden als gültige Glob-Muster behandelt, was bedeutet, dass sie auch definiert werden können.

Build-Tools

  • MÜSSEN jeden Wert als Glob-Muster behandeln und MÜSSEN einen Fehler auslösen, wenn das Muster eine ungültige Glob-Syntax enthält.
  • MÜSSEN alle Dateien, die von einem aufgelisteten Muster übereinstimmen, in allen Verteilungsarchiven enthalten.
  • MÜSSEN jeden übereinstimmenden Dateipfad unter einem License-File Feld in den Core Metadata auflisten.
  • MÜSSEN einen Fehler auslösen, wenn ein einzelnes benutzerspezifisches Muster nicht mindestens eine Datei übereinstimmt.

Wenn der Schlüssel license-files vorhanden ist und auf einen leeren Array-Wert gesetzt ist, dann DÜRFEN Tools keine Lizenzdateien einschließen und KEINEN Fehler auslösen.

Beispiele für gültige Deklarationen von Lizenzdateien

[project]
license-files = ["LICEN[CS]E*", "AUTHORS*"]

[project]
license-files = ["licenses/LICENSE.MIT", "licenses/LICENSE.CC0"]

[project]
license-files = ["LICENSE.txt", "licenses/*"]

[project]
license-files = []

Beispiele für ungültige Deklarationen von Lizenzdateien

[project]
license-files = ["..\LICENSE.MIT"]

Grund: .. darf nicht verwendet werden. \ ist ein ungültiger Pfadtrenner, / muss verwendet werden.

[project]
license-files = ["LICEN{CSE*"]

Grund: „LICEN{CSE*“ ist kein gültiges Glob.

Tabellen-Unterschlüssel license als veraltet markieren

Tabellenwerte für den Schlüssel license in der [project] Tabelle, einschließlich der Unter-Schlüssel text und file, sind nun veraltet. Wenn der neue Schlüssel license-files vorhanden ist, MÜSSEN Build-Tools einen Fehler auslösen, wenn der Schlüssel license definiert ist und einen anderen Wert als einen einzelnen Top-Level-String hat.

Wenn der neue Schlüssel license-files nicht vorhanden ist und der Unter-Schlüssel text in einer license Tabelle vorhanden ist, SOLLTEN Tools eine Warnung ausgeben, die Benutzer darüber informiert, dass dies veraltet ist, und stattdessen einen Lizenz-Ausdruck als Top-Level-String-Schlüssel empfiehlt.

Ebenso, wenn der neue Schlüssel license-files nicht vorhanden ist und der Unter-Schlüssel file in der license Tabelle vorhanden ist, SOLLTEN Tools eine Warnung ausgeben, die Benutzer darüber informiert, dass dies veraltet ist, und stattdessen den Schlüssel license-files empfiehlt.

Wenn die angegebene Lizenzdatei file im Quellcode-Baum vorhanden ist, SOLLTEN Build-Tools sie verwenden, um das Feld License-File in den Core Metadata zu füllen, und MÜSSEN die angegebene Datei so einbeziehen, als wäre sie in einem Feld license-file angegeben. Wenn die Datei am angegebenen Pfad nicht existiert, MÜSSEN Tools einen informativen Fehler auslösen, wie zuvor angegeben.

Tabellenwerte für den Schlüssel license KÖNNEN aus einer neuen Version der Spezifikation in einem zukünftigen PEP entfernt werden.

Lizenzdateien in Projektformaten

Es werden einige Ergänzungen zu den bestehenden Spezifikationen vorgenommen.

Projekt-Quellbaume
Gemäß dem Abschnitt Projekt-Quellmetadaten wird die Spezifikation Declaring Project Metadata aktualisiert, um widerzuspiegeln, dass Lizenzdateipfade relativ zum Stammverzeichnis des Projekts sein MÜSSEN; d. h. dem Verzeichnis, das die pyproject.toml (oder äquivalente, andere Legacy-Projektkonfigurationen, z. B. setup.py, setup.cfg usw.) enthält.
Quellcode-Distributionen (sdists)
Die sdist-Spezifikation wird aktualisiert, um widerzuspiegeln, dass, wenn die Metadata-Version 2.4 oder höher ist, die sdist alle Lizenzdateien enthalten MUSS, die durch das Feld License-File in der PKG-INFO an ihren jeweiligen Pfaden relativ zur sdist (die pyproject.toml und die PKG-INFO Core Metadata enthält) angegeben sind.
Eingebaute Distributionen (Wheels)
Die Wheel-Spezifikation wird aktualisiert, um widerzuspiegeln, dass, wenn die Metadata-Version 2.4 oder höher ist und ein oder mehrere Felder License-File angegeben sind, das Verzeichnis .dist-info ein Unterverzeichnis licenses enthalten MUSS, das die Dateien enthalten MUSS, die in den Feldern License-File in der Datei METADATA an ihren jeweiligen Pfaden relativ zum Verzeichnis licenses aufgelistet sind.
Installierte Projekte
Die Recording Installed Projects-Spezifikation wird aktualisiert, um widerzuspiegeln, dass, wenn die Metadata-Version 2.4 oder höher ist und ein oder mehrere Felder License-File angegeben sind, das Verzeichnis .dist-info ein Unterverzeichnis licenses enthalten MUSS, das die Dateien enthalten MUSS, die in den Feldern License-File in der Datei METADATA an ihren jeweiligen Pfaden relativ zum Verzeichnis licenses aufgelistet sind, und dass alle Dateien in diesem Verzeichnis von den Installationswerkzeugen aus Wheels kopiert werden MÜSSEN.

Konvertierung von Legacy-Metadaten

Tools DÜRFEN NICHT den Inhalt des Feldes license.text des Schlüssels [project] (oder ein äquivalentes Tool-spezifisches Format), Lizenzklassifikatoren oder den Wert des Feldes License in den Core Metadata verwenden, um den Top-Level-String-Wert des Schlüssels license oder das Feld License-Expression in den Core Metadata zu füllen, ohne den Benutzer zu informieren und eine eindeutige, affirmative Benutzeraktion zur Auswahl und Bestätigung des gewünschten Lizenz-Ausdruckswerts zu verlangen, bevor fortgefahren wird.

Tool-Autoren, die Lizenzklassifikatoren automatisch in SPDX-Identifikatoren konvertieren müssen, können die von den PEP-Autoren vorbereitete Empfehlung verwenden.

Abwärtskompatibilität

Das Hinzufügen eines neuen Feldes License-Expression in den Core Metadata und eines Top-Level-String-Werts für den Schlüssel license in der [project] Tabelle der pyproject.toml bedeutet eindeutig Unterstützung für die Spezifikation in diesem PEP. Dies vermeidet das Risiko, dass neue Werkzeuge einen Lizenz-Ausdruck als freiformatige Lizenzbeschreibung oder umgekehrt falsch interpretieren.

Das veraltete und abgelaufene Feld License in den Core Metadata, die Unter-Schlüssel der Tabelle license ( text und file) in der [project] Tabelle der pyproject.toml und Lizenzklassifikatoren behalten die Abwärtskompatibilität. Eine Entfernung wird einem zukünftigen PEP und einer neuen Version der Core Metadata-Spezifikation überlassen.

Die Spezifikation des neuen Feldes License-File in den Core Metadata und die Aufnahme der Dateien in die Distribution ist weitgehend abwärtskompatibel mit der bestehenden Verwendung dieses Feldes in vielen Packaging-Tools. Der neue Schlüssel license-files in der Tabelle [project] der pyproject.toml wird erst wirksam, wenn Benutzer und Tools ihn übernehmen.

Dieser PEP spezifiziert, dass Lizenzdateien in einem dedizierten licenses Unterverzeichnis des Verzeichnisses .dist-info platziert werden sollten. Dies ist neu und stellt sicher, dass Wheels, die diesem PEP folgen, anders lokalisierte Lizenzen im Vergleich zu denen haben, die über das frühere, Installer-spezifische Verhalten erstellt wurden. Dies wird durch eine neue Metadatenversion unterstützt.

Dies löst auch aktuelle Probleme, bei denen Lizenzdateien versehentlich überschrieben werden, wenn sie an verschiedenen Orten den gleichen Namen haben, was Wheels unverteilbar macht, ohne dass es bemerkt wird. Es verhindert auch Konflikte mit anderen Metadaten-Dateien im selben Verzeichnis.

Die Ergänzungen werden zu den Spezifikationen für Quellcode-Distribution (sdist), eingebaute Distribution (Wheel) und installierte Projekte hinzugefügt. Sie dokumentieren Verhaltensweisen, die unter ihren aktuellen Spezifikationen erlaubt sind, und koppeln sie an die neue Metadatenversion.

Dieser PEP schlägt vor, dass PyPI die Validierung der neuen Felder License-Expression und License-File implementiert, was keine Auswirkungen auf neue und bestehende Pakete hat, die hochgeladen werden, es sei denn, sie entscheiden sich ausdrücklich für die Verwendung dieser neuen Felder und halten sich nicht korrekt an die Spezifikation. Daher hat dies keine Auswirkungen auf die Abwärtskompatibilität und garantiert die Vorwärtskompatibilität, indem sichergestellt wird, dass alle Distributionen, die mit den neuen Feldern auf PyPI hochgeladen werden, der Spezifikation entsprechen.

Sicherheitsimplikationen

Dieser PEP hat keine absehbaren Sicherheitsauswirkungen: Das Feld License-Expression ist ein einfacher String und die Felder License-File sind Dateipfade. Keiner von beiden führt zu bekannten neuen Sicherheitsbedenken.

Wie man das lehrt

Die Mehrheit der Pakete verwendet eine einzelne Lizenz, was den Fall einfach macht: ein einzelner Lizenzidentifikator ist ein gültiger Lizenz-Ausdruck.

Benutzer von Packaging-Tools lernen den gültigen Lizenz-Ausdruck ihres Pakets durch die Nachrichten der Tools, wenn diese ungültige erkennen oder wenn das veraltete Feld License oder Lizenzklassifikatoren verwendet werden.

Wenn ein ungültiger License-Expression verwendet wird, können Benutzer ihr Paket nicht auf PyPI veröffentlichen, und eine Fehlermeldung hilft ihnen zu verstehen, dass sie SPDX-Identifikatoren verwenden müssen. Es wird möglich sein, eine Distribution mit falschen Lizenzmetadaten zu generieren, aber nicht, eine auf PyPI oder einem anderen Indexserver zu veröffentlichen, der die Gültigkeit von License-Expression erzwingt. Für Autoren, die das nun veraltete Feld License oder Lizenzklassifikatoren verwenden, können Packaging-Tools sie warnen und über den Ersatz, License-Expression, informieren.

Tools können auch bei der Konvertierung helfen und in vielen gängigen Fällen einen Lizenz-Ausdruck vorschlagen.

Referenzimplementierung

Tools müssen die Unterstützung für das Parsen und Validieren von Lizenz-Ausdrücken im Feld License-Expression bereitstellen, wenn sie sich entscheiden, diesen Teil der Spezifikation zu implementieren. Es obliegt den Tools, ob sie die Validierung auf ihrer Seite implementieren möchten (z. B. wie hatch) oder eine der verfügbaren Python-Bibliotheken verwenden möchten (z. B. license-expression). Dieser PEP schreibt die Verwendung einer bestimmten Bibliothek nicht vor und überlässt es den Tool-Autoren, die beste Implementierung für ihre Projekte zu wählen.

Abgelehnte Ideen

Viele alternative Ideen wurden vorgeschlagen und nach sorgfältiger Prüfung abgelehnt. Die vollständige Liste einschließlich der Gründe für die Ablehnung finden Sie auf einer separaten Seite.

Anhänge

Eine Liste von Hilfsdokumenten wird bereitgestellt.

Danksagungen

  • Alyssa Coghlan
  • Kevin P. Fleming
  • Pradyun Gedam
  • Oleg Grenrus
  • Dustin Ingram
  • Chris Jerdonek
  • Cyril Roelandt
  • Luis Villa
  • Seth M. Larson
  • Ofek Lev

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

Zuletzt geändert: 2025-01-24 23:56:07 GMT