Как назначить номер версии для пакета Python, используя SVN и distutils?

StackOverflow https://stackoverflow.com/questions/631813

  •  08-07-2019
  •  | 
  •  

Вопрос

Я пишу пакет на 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? , чем больше людей понимают, есть способ сделать это, чтобы избежать проблем с импортом вашего модуля из сценария установки, тем лучше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top