Korzystanie setuptools
ipbr
Nie ma standardowego sposobu zarządzania wersją, ale standardowy sposób zarządzania pakietami to setuptools
.
Najlepszym rozwiązaniem, jakie znalazłem ogólnie do zarządzania wersją, jest użycie setuptools
z pbr
rozszerzeniem. To jest teraz mój standardowy sposób zarządzania wersją.
Ustawienie projektu na pełne pakowanie może być przesadą w przypadku prostych projektów, ale jeśli potrzebujesz zarządzać wersją, prawdopodobnie jesteś na odpowiednim poziomie, aby wszystko skonfigurować. Dzięki temu Twój pakiet można zwolnić w PyPi, dzięki czemu każdy może go pobrać i używać z Pip.
PBR przenosi większość metadanych z setup.py
narzędzi do setup.cfg
pliku, który jest następnie wykorzystywany jako źródło większości metadanych, które mogą obejmować wersję. Umożliwia to spakowanie metadanych do pliku wykonywalnego przy użyciu czegoś takiego jak w pyinstaller
razie potrzeby (jeśli tak, prawdopodobnie będziesz potrzebować tych informacji ) i oddziela metadane od innych skryptów zarządzania / konfiguracji pakietu. Możesz bezpośrednio zaktualizować ciąg wersji setup.cfg
ręcznie, a zostanie on pobrany do *.egg-info
folderu podczas budowania wydań pakietu. Skrypty mogą następnie uzyskać dostęp do wersji z metadanych przy użyciu różnych metod (procesy te opisano w poniższych sekcjach).
Podczas korzystania z Git dla VCS / SCM ta konfiguracja jest jeszcze lepsza, ponieważ pobierze wiele metadanych z Git, dzięki czemu Twoje repozytorium może być głównym źródłem prawdy dla niektórych metadanych, w tym wersji, autorów, dzienników zmian, itp. Dla konkretnej wersji utworzy ciąg wersji dla bieżącego zatwierdzenia na podstawie znaczników git w repozytorium.
Ponieważ PBR pobierze wersję, autora, dziennik zmian i inne informacje bezpośrednio z repozytorium git, więc niektóre metadane setup.cfg
można pominąć i wygenerować automatycznie za każdym razem, gdy tworzona jest dystrybucja pakietu (za pomocą setup.py
)
Aktualna wersja w czasie rzeczywistym
setuptools
pobierze najnowsze informacje w czasie rzeczywistym, używając setup.py
:
python setup.py --version
Spowoduje to pobranie najnowszej wersji z setup.cfg
pliku lub z repozytorium git na podstawie ostatniego zatwierdzenia i znaczników istniejących w repozytorium. To polecenie nie aktualizuje jednak wersji w dystrybucji.
Aktualizacja wersji
Po utworzeniu dystrybucji za pomocą setup.py
( py setup.py sdist
np.) Wszystkie bieżące informacje zostaną wyodrębnione i zapisane w dystrybucji. Zasadniczo uruchamia to setup.py --version
polecenie, a następnie przechowuje informacje o wersji w package.egg-info
folderze w zestawie plików przechowujących metadane dystrybucji.
Uwaga na temat procesu aktualizacji metadanych wersji:
Jeśli nie używasz pbr do pobierania danych wersji z git, po prostu zaktualizuj plik setup.cfg bezpośrednio informacjami o nowej wersji (dość łatwe, ale upewnij się, że jest to standardowa część procesu wydania).
Jeśli używasz git i nie musisz tworzyć dystrybucji źródłowej lub binarnej (za pomocą python setup.py sdist
lub jednego z python setup.py bdist_xxx
poleceń), najprostszym sposobem na aktualizację informacji git repo w <mypackage>.egg-info
folderze metadanych jest po prostu uruchomienie python setup.py install
polecenia. Spowoduje to uruchomienie wszystkich funkcji PBR związanych z pobieraniem metadanych z repozytorium git i aktualizację lokalnego .egg-info
folderu, zainstalowanie plików wykonywalnych skryptu dla wszystkich zdefiniowanych przez ciebie punktów wejścia oraz innych funkcji, które można zobaczyć z danych wyjściowych po uruchomieniu tego polecenia.
Zauważ, że .egg-info
folder jest generalnie wykluczony z przechowywania w samym repozytorium git w standardowych .gitignore
plikach Pythona (takich jak Gitignore.IO ), ponieważ można go wygenerować ze źródła. Jeśli jest to wykluczone, upewnij się, że masz standardowy „proces wydawania”, aby zaktualizować metadane lokalnie przed wydaniem, a każdy pakiet przesyłany do PyPi.org lub w inny sposób rozpowszechniany musi zawierać te dane, aby mieć poprawną wersję. Jeśli chcesz, aby repozytorium Git zawierało te informacje, możesz wykluczyć ignorowanie określonych plików (np. Dodać !*.egg-info/PKG_INFO
do .gitignore
)
Dostęp do wersji ze skryptu
Możesz uzyskać dostęp do metadanych z bieżącej wersji w skryptach Python w samym pakiecie. Na przykład w przypadku wersji istnieje kilka sposobów, aby to zrobić:
## 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))
Możesz umieścić jeden z nich bezpośrednio w swoim __init__.py
pakiecie, aby wyodrębnić informacje o wersji w następujący sposób, podobnie do niektórych innych odpowiedzi:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version