Використання setuptools
таpbr
Існує не стандартний спосіб управління версією, але стандартний спосіб управління вашими пакунками є setuptools
.
Найкраще рішення, яке я знайшов в цілому для управління версією, - це використовувати setuptools
з pbr
розширенням. Це тепер мій стандартний спосіб управління версією.
Налаштування проекту на повну упаковку може бути надмірним для простих проектів, але якщо вам потрібно керувати версією, ви, ймовірно, на правильному рівні, щоб просто все налаштувати. Це також робить ваш пакет звільненим на PyPi, щоб кожен міг завантажити та використовувати його разом із Pip.
PBR переміщує більшість метаданих із setup.py
інструментів та у setup.cfg
файл, який потім використовується як джерело для більшості метаданих, до яких може входити версія. Це дозволяє упакувати метадані у виконуваний файл, використовуючи щось на зразок, pyinstaller
якщо це потрібно (якщо так, то, ймовірно, вам знадобиться ця інформація ) та відокремлює метадані від інших сценаріїв управління / налаштування пакунків. Ви можете безпосередньо оновити рядок версії setup.cfg
вручну, і вона буде втягнута в*.egg-info
папку при релізів вашого пакета. Потім ваші сценарії можуть отримати доступ до версії з метаданих за допомогою різних методів (ці процеси викладені в розділах нижче).
Під час використання Git для VCS / SCM ця настройка є ще кращою, оскільки вона дозволить отримати багато метаданих від Git, щоб ваше репо було основним джерелом правди для деяких метаданих, зокрема версії, авторів, журналів змін, і т.д. Для конкретної версії, вона створить рядок версії для поточної фіксації на основі тегів git в репо.
Оскільки PBR буде виводити версію, автора, журнал змін та іншу інформацію безпосередньо з вашого git repo, то деякі метадані в setup.cfg
можна залишатись і автоматично генеруватися кожного разу, коли буде створено розповсюдження для вашого пакету (використовуючиsetup.py
)
Поточна версія в реальному часі
setuptools
отримає останню інформацію в режимі реального часу, використовуючи setup.py
:
python setup.py --version
Це витягне останню версію або з setup.cfg
файлу, або з git repo, на основі останнього комітету, який було зроблено, і тегів, які існують у репо. Ця команда не оновлює версію в дистрибутиві.
Оновлення версії
Коли ви створюєте дистрибутив за допомогою setup.py
(наприклад py setup.py sdist
, наприклад), то вся поточна інформація буде вилучена та збережена в дистрибутиві. Це, по суті, запускає setup.py --version
команду, а потім зберігає інформацію про версію в package.egg-info
папку у наборі файлів, що зберігають метадані розподілу.
Примітка щодо процесу оновлення метаданих версії:
Якщо ви не використовуєте pbr для отримання даних про версію з git, просто оновіть свій setup.cfg безпосередньо новою інформацією про версію (досить просто, але переконайтесь, що це стандартна частина процесу випуску).
Якщо ви використовуєте git, і вам не потрібно створювати джерело чи двійковий дистрибутив (використовуючи python setup.py sdist
або одну з python setup.py bdist_xxx
команд), найпростіший спосіб оновити інформацію про репортаж git у вашій <mypackage>.egg-info
папці метаданих - це просто запустити python setup.py install
команду. Це запустить усі функції PBR, пов’язані з витягуванням метаданих з git repo та оновленням локальної .egg-info
папки, встановленням виконавчих файлів сценаріїв для будь-яких визначених вами вхідних точок та інших функцій, які ви можете бачити з виводу при виконанні цієї команди.
Зауважте, що .egg-info
папка, як правило, виключається із збереження у самій git repo в стандартних .gitignore
файлах Python (наприклад, з Gitignore.IO ), оскільки вона може бути створена з вашого джерела. Якщо це виключено, переконайтеся, що у вас є стандартний "процес випуску", щоб метадані були оновлені локально перед випуском, і будь-який пакет, який ви завантажуєте на PyPi.org або розповсюджуєте іншим чином, повинен містити ці дані, щоб мати правильну версію. Якщо ви хочете, щоб Git repo містив цю інформацію, ви можете виключити конкретні файли з ігнорування (тобто додати !*.egg-info/PKG_INFO
до .gitignore
)
Доступ до версії зі сценарію
Ви можете отримати доступ до метаданих з поточної збірки в сценаріях Python в самому пакеті. Наприклад, для версії, наприклад, існує кілька способів зробити це:
## 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))
Ви можете покласти одне з них безпосередньо у свій __init__.py
пакет для отримання інформації про версію наступним чином, як і деякі інші відповіді:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version