Как назначить номер версии для пакета Python, используя SVN и distutils?
Вопрос
Я пишу пакет на Python. Пакет должен знать свой номер версии внутри, а также включать эту версию в скрипт setup.py
для distutils
.
Как лучше всего это сделать, чтобы номер версии не нужно было хранить в двух разных местах? Я не хочу импортировать скрипт setup.py
из остальной части моей библиотеки (это выглядит довольно глупо), и я не хочу импортировать мою библиотеку из setup.py
script (аналогично). В идеале я бы просто установил ключевое слово в svn
и автоматически подставил его в файлы, но в svn
это не представляется возможным. Я мог бы прочитать общий текстовый файл, содержащий номер версии в обоих местах - это лучшее решение?
Чтобы уточнить : я хочу сохранить номер версии в одном месте. Да, я мог бы поместить переменную в пакет и снова в файл setup.py
. Но тогда они неизбежно вышли бы из синхронизации.
Решение
Внутри вашего основного пакета у вас, вероятно, есть __ init __. py
, верно?
Структура каталогов:
> ./packageTest
> ./packageTest/__init__.py
> ./packageTest/setup.py
В файле __ init __. py
добавьте следующую строку:
# package directory __init__.py
__version__ = 1.0
файл setup.py:
# setup.py
from packageTest import __version__
...
Теперь в любом модуле, который импортирует из каталога пакетов (я назову packageTest), вы можете сделать это:
from packageTest import setup
print 'Setup.py version:', setup.__version__
# prints Setup.py version: 1.0
Другие советы
Импортировать скрипт установки внутри вашего пакета глупо (тем более, что он может больше не присутствовать после установки вашей библиотеки), но импорт вашей библиотеки в setup.py должен быть в порядке. Также будет работать отдельный текстовый файл, но есть проблема, что вы должны установить текстовый файл вместе с вашим пакетом, если вы хотите получить доступ к номеру версии во время выполнения.
У меня была похожая проблема с моим проектом. Я написал скрипт верхнего уровня, test / build / package / deploy, который называется build.py (не на основе distutils, обратите внимание). Он читает файл свойств , который содержит централизованный номер версии. Вместо того, чтобы поддерживать файл setup.py напрямую, я сохраняю файл шаблона , и мой сценарий build.py считывает его, заменяет переменную version значением из файла props, а затем записывает сценарий setup.py. Затем мой файл сценария выполнит его, чтобы сгенерировать пакет или загрузить в pypi.
См. также Стандартный способ внедрения версии в пакет python? о том, как распространять информацию о версии из одного места (файл с именем _version.py
) в места, где его ищет другой код (например, атрибут с именем __ version __
и PEP 0345
метаданные).
Тогда см. Брайана Уорнера, новый " versioneer " инструмент , который создает файл _version.py
из истории контроля версий.
Кроме того, ознакомьтесь с моим ответом на Стандартный способ внедрения версии в пакет python? , чем больше людей понимают, есть способ сделать это, чтобы избежать проблем с импортом вашего модуля из сценария установки, тем лучше.