Кровотечение края/ночные сборки управления зависимостями в 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 3

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

Предупреждающая постройка загадочна и груба по краям, как только что всплывший вулканический остров из горячей лавы. Это более элегантно, чем генерирование требований pip.txt с пользовательскими скриптами? Да, если у вас есть еще чем одна библиотека, которой нужно управлять.