Кровотечение края/ночные сборки управления зависимостями в Python. Стратегии и лучшие практики?
Ситуация
У вас есть 2 программных продукта в разработке, библиотека , которая представляет API и инструмент GUI, который предоставляет библиотеку для конечных пользователей. Кроме того, вы ожидаете, что большой технический персонал на вашем месте будет использовать библиотеку в качестве строительного блока для всех видов соответствующего пользовательского кода, инструментов и активов.
Оба программных продукта(библиотека и графический инструмент) активно развиваются и влияют друг на друга. Для и вы хотите самый простой способ распространения и настройки devenv, используя pip:
pip install gui_tool
or
pip install library
Графический инструмент (пример использования 1)
Установка инструмента GUI происходит через pip , и зависимости отмечаются жестким номером версии в setup.py ваша библиотека является одной из таких зависимостей:
...
install_requires = ['library==1.2, package_x==0.3, package_y==0.6'],
...
Процедура установки состоит из установки инструментов и разрешения зависимостей в новый virtualenv. Потому что каждый версия зависимостей жестко связана, вы контролируете стабильную и последовательную установку. Ночные сборки/зависимости bleeding edge могут управляться разработчиками путем ручного обновления библиотеки до более новых версий:
pip install --upgrade library # get the latest nightly build/hotfix release on your own
Пользовательский код / инструменты (вариант использования 2)
Как уже упоминалось, множество кода и пользовательских инструментов может быть построено с использованием API, который предоставляет ваша библиотека . Все желающие использовать его должны установить / обновить его через pip легко с помощью oneliner от вершина.
Задача
FellowGUI tool разработчики должны быть в состоянии тянуть в ночные сборки/исправления релизыбиблиотеки зависимости с pip. Другие сотрудники, использующие библиотеку в качестве строительного блока, всегда должны получать последнюю стабильную версию с помощью pip. Вы хотите сохранить одну уникальную процедуру выпуска для библиотеки , предоставляющей стабильные версии, выпуски bleeding edge и исправлений через X. Y. Z versioning.
Там есть несколько возможных решений этого, например:
- поддержание readme для пользовательских пользователей, который указывает стабильные версии, которые они должны устанавливать с pip
- или создание какой-то магии внутри setup.py для инструмента Gui клонирование репозитория git и его использование через python setup.py развивать (управление версиями может быть затем обработано разработчиками через проверки в репо) .
Однако ни один из них не кажется особенно элегантный, так что я заинтересован в ваших решениях, идеях или лучших практиках для стабильного / bleeding edge / nightly build dependency management для Python?
2 ответа:
Управление версией "bleeding edge" в
pip
может быть достигнуто с помощью--pre
флаг страныpip
Из
pip install --help
:-- pre включает в себя предварительные версии и версии разработки. По умолчанию pip находит только стабильные версии.
Вы должны добавить классификаторы в свой проект, в частности, установить стабильный релиз на
Development Status :: 5 - Production/Stable
, а ваши "выпуски bleeding edge" - на все, что ниже 5.Вот как основные пакеты python управляйте их альфами, например: проектdjango с текущим 1.9 a в alpha и 1.8.5 в stable.
Для обновления до последней версии, помеченной как
Development Status :: 3 - Alpha
:pip install --pre --upgrade library
Пользователям, использующим библиотеку в качестве строительных блоков, не нужно сейчас об альфа-релизах и пойдет с обычной
pip install library
, которая установит последнюю стабильную помеченную версию.
Я не уверен, Нужно ли вам управлять библиотекой или несколькими библиотеками?
Похоже, что у вас есть случай сложного отслеживания и развертывания зависимостей Python. Есть несколько крупных проектов Python, которые сталкиваются с той же проблемой с необходимостью отслеживать несколько различных каналов выпуска, бета-версии и bleeding edge. Наиболее заметным из них является Plone , который содержит более 300 МБ исходного кода Python egg.
Plone использовал buildout в качестве менеджера зависимостей вместо pip, чтобы разберитесь со сложностью. Buildout предлагает смешивать и сопоставлять конфигурационные файлы для зависимостей Python.
Чтобы быстро понять, как это происходит смотрите Plone core buildouts
Пример последней версии Plone 5.0: http://dist.plone.org/release/5.0-latest/versions.cfg
Пример более старого Plone 4.X последний релиз: http://dist.plone.org/release/4.3rc1/versions.cfg
Репозиторий Github, который управляет процессом https://github.com/plone/buildout.coredev - однако сложность здесь выросла настолько, что постороннему человеку уже не очень легко понять, что происходит. Процесс выпуска описан здесь http://buildoutcoredev.readthedocs.org/en/latest/release.html
Предупреждающая постройка загадочна и груба по краям, как только что всплывший вулканический остров из горячей лавы. Это более элегантно, чем генерирование требований pip.txt с пользовательскими скриптами? Да, если у вас есть еще чем одна библиотека, которой нужно управлять.