Verwenden von setuptools
undpbr
Es gibt keine Standardmethode zum Verwalten der Version, aber die Standardmethode zum Verwalten Ihrer Pakete ist setuptools
.
Die beste Lösung, die ich insgesamt für die Verwaltung der Version gefunden habe, ist die Verwendung setuptools
mit dempbr
Erweiterung. Dies ist jetzt meine Standardmethode zum Verwalten der Version.
Das Einrichten Ihres Projekts für die vollständige Verpackung kann für einfache Projekte übertrieben sein. Wenn Sie jedoch die Version verwalten müssen, sind Sie wahrscheinlich auf der richtigen Ebene, um einfach alles einzurichten. Dadurch wird Ihr Paket auch bei PyPi freigegeben kann sodass jeder es herunterladen und mit Pip verwenden kann.
PBR verschiebt die meisten Metadaten aus den setup.py
Tools in eine setup.cfg
Datei, die dann als Quelle für die meisten Metadaten verwendet wird, einschließlich der Version. Auf diese Weise können die Metadaten bei Bedarf in eine ausführbare Datei gepackt pyinstaller
werden (falls ja, benötigen Sie wahrscheinlich diese Informationen ), und die Metadaten werden von den anderen Paketverwaltungs- / Setup-Skripten getrennt. Sie können die Versionszeichenfolge direkt setup.cfg
manuell aktualisieren , und sie wird in die Datei gezogen*.egg-info
Erstellen Ihrer Paketversionen Ordner . Ihre Skripte können dann mit verschiedenen Methoden aus den Metadaten auf die Version zugreifen (diese Prozesse werden in den folgenden Abschnitten beschrieben).
Wenn Sie Git für VCS / SCM verwenden, ist dieses Setup sogar noch besser, da viele Metadaten von Git abgerufen werden, sodass Ihr Repo Ihre primäre Wahrheitsquelle für einige der Metadaten sein kann, einschließlich Version, Autoren, Änderungsprotokolle, usw. Für die spezifische Version wird eine Versionszeichenfolge für das aktuelle Commit basierend auf den Git-Tags im Repo erstellt.
Da PBR Version, Autor, Änderungsprotokoll und andere Informationen direkt aus Ihrem Git-Repo abruft, sind einige der Metadaten in setup.cfg
und automatisch generiert werden, wenn eine Distribution für Ihr Paket erstellt wird (mithilfe von setup.py
).
Aktuelle Echtzeitversion
setuptools
wird die neuesten Informationen in Echtzeit mit abrufen setup.py
:
python setup.py --version
Dadurch wird die neueste Version entweder aus dem setup.cfg
Datei oder aus dem Git-Repo abgerufen, basierend auf dem zuletzt vorgenommenen Commit und den im Repo vorhandenen Tags. Dieser Befehl aktualisiert die Version in einer Distribution jedoch nicht.
Aktualisierung der Version
Wenn Sie eine Distribution mit setup.py
( py setup.py sdist
z. B.) erstellen , werden alle aktuellen Informationen extrahiert und in der Distribution gespeichert. Dies führt im Wesentlichen den setup.py --version
Befehl aus und speichert diese Versionsinformationen in dem package.egg-info
Ordner in einer Reihe von Dateien, in denen Verteilungsmetadaten gespeichert sind.
Hinweis zum Aktualisieren der Versionsmetadaten:
Wenn Sie pbr nicht zum Abrufen von Versionsdaten aus git verwenden, aktualisieren Sie einfach Ihre setup.cfg direkt mit neuen Versionsinformationen (einfach genug, aber stellen Sie sicher, dass dies ein Standardbestandteil Ihres Veröffentlichungsprozesses ist).
Wenn Sie git verwenden und keine Quell- oder Binärdistribution (mit python setup.py sdist
oder einem der python setup.py bdist_xxx
Befehle) erstellen müssen, können Sie die git-Repo-Informationen am einfachsten in Ihrem <mypackage>.egg-info
Metadatenordner aktualisieren, indem Sie einfach den python setup.py install
Befehl ausführen . Dadurch werden alle PBR-Funktionen ausgeführt, die sich auf das Abrufen von Metadaten aus dem Git-Repo beziehen, Ihren lokalen .egg-info
Ordner aktualisieren , ausführbare Skriptdateien für alle von Ihnen definierten Einstiegspunkte installieren und andere Funktionen, die Sie in der Ausgabe sehen können, wenn Sie diesen Befehl ausführen.
Beachten Sie, dass der .egg-info
Ordner im Allgemeinen nicht im Git-Repo selbst in Standard-Python- .gitignore
Dateien (z. B. von Gitignore.IO ) gespeichert werden kann , da er aus Ihrer Quelle generiert werden kann. Wenn dies ausgeschlossen ist, stellen Sie sicher, dass Sie über einen Standard- "Freigabeprozess" verfügen, um die Metadaten vor der Veröffentlichung lokal zu aktualisieren. Jedes Paket, das Sie auf PyPi.org hochladen oder auf andere Weise verteilen, muss diese Daten enthalten, um die richtige Version zu haben. Wenn das Git-Repo diese Informationen enthalten soll, können Sie ausschließen, dass bestimmte Dateien ignoriert werden (dh hinzufügen !*.egg-info/PKG_INFO
zu .gitignore
).
Zugriff auf die Version über ein Skript
Sie können auf die Metadaten aus dem aktuellen Build in Python-Skripten im Paket selbst zugreifen. Für die Version gibt es zum Beispiel verschiedene Möglichkeiten, dies zu tun, die ich bisher gefunden habe:
## This one is a new built-in as of Python 3.8.0 should become the standard
from importlib-metadata import version
v0 = version("mypackage")
print('v0 {}'.format(v0))
## I don't like this one because the version method is hidden
import pkg_resources # part of setuptools
v1 = pkg_resources.require("mypackage")[0].version
print('v1 {}'.format(v1))
# Probably best for pre v3.8.0 - the output without .version is just a longer string with
# both the package name, a space, and the version string
import pkg_resources # part of setuptools
v2 = pkg_resources.get_distribution('mypackage').version
print('v2 {}'.format(v2))
## This one seems to be slower, and with pyinstaller makes the exe a lot bigger
from pbr.version import VersionInfo
v3 = VersionInfo('mypackage').release_string()
print('v3 {}'.format(v3))
Sie können eine davon direkt in Ihr __init__.py
Paket einfügen, um die Versionsinformationen wie folgt zu extrahieren, ähnlich wie bei einigen anderen Antworten:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version