Verwenden von setuptoolsundpbr
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 setuptoolsmit 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.pyTools in eine setup.cfgDatei, 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 pyinstallerwerden (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.cfgmanuell 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 sdistz. B.) erstellen , werden alle aktuellen Informationen extrahiert und in der Distribution gespeichert. Dies führt im Wesentlichen den setup.py --versionBefehl aus und speichert diese Versionsinformationen in dem package.egg-infoOrdner 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 sdistoder einem der python setup.py bdist_xxxBefehle) erstellen müssen, können Sie die git-Repo-Informationen am einfachsten in Ihrem <mypackage>.egg-infoMetadatenordner aktualisieren, indem Sie einfach den python setup.py installBefehl ausführen . Dadurch werden alle PBR-Funktionen ausgeführt, die sich auf das Abrufen von Metadaten aus dem Git-Repo beziehen, Ihren lokalen .egg-infoOrdner 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-infoOrdner im Allgemeinen nicht im Git-Repo selbst in Standard-Python- .gitignoreDateien (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_INFOzu .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__.pyPaket 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