Библиотека сайта rus-linux.net
Архитектура системы управления пакетами в Python
Глава 14 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: Python Packaging
Автор: Tarek Ziade
Дата публикации: 7 Июня 2012 г.
Перевод: А.Панин
Дата публикации перевода: 3 апреля 2013 г.
Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
14.3 Современная архитектура системы управления пакетами
14.3.3. Архитектура PyPI
Рисунок 14.3: Процесс работы PyPI
Как было сказано ранее, PyPI является центральным каталогом проектов на языке Python, с помощью которого люди могут просматривать существующие разделенные на категории проекты или регистрировать свои работы. Архивы с исходным кодом и бинарными файлами для распространения могут быть загружены и добавлены к существующему проекту, после чего становится возможным их скачивание для установки или изучения. PyPI также предоставляет веб-сервисы, которые могут использоваться такими инструментами, как установщики.
Регистрация проектов и загрузка архивов
register
пакета Distutils
. С помощью этой команды формируется POST-запрос, содержащий метаданные проекта вне зависимости от его версии. Запрос содержит заголовок авторизации, так как PyPI использует механизм аутентификации Basic для того, чтобы каждый зарегистрированный проект был ассоциирован с пользователем, ранее зарегистрировавшимся в PyPI. Аутентификационные данные хранятся в локальном файле настроек Distutils
или вводятся после запроса при каждом вызове команды register
. Пример использования этой команды:
$ python setup.py register running register Registering MPTools to http://pypi.python.org/pypi Server response (200): OK
upload
:
$ python setup.py sdist upload running sdist ... running upload Submitting dist/mopytools-0.1.tar.gz to http://pypi.python.org/pypi Server response (200): OK
Также возможно перенаправление пользователей на другой адрес с помощью поля метаданных Download-URL
вместо загрузки файлов напрямую на PyPI.
Запросы к PyPI
Помимо HTML-страниц, генерируемых PyPI для пользователей, с помощью инструментов могут быть использованы две службы: простой протокол каталога и API XML-RPC.
http://pypi.python.org/simple/
, причем в ответ отправляется обычная HTML-страница, содержащая относительные ссылки на страницы каждого из зарегистрированных проектов:
<html><head><title>Simple Index</title></head><body> : : : <a href='MontyLingua/'>MontyLingua</a><br/> <a href='mootiro_web/'>mootiro_web</a><br/> <a href='Mopidy/'>Mopidy</a><br/> <a href='mopowg/'>mopowg</a><br/> <a href='MOPPY/'>MOPPY</a><br/> <a href='MPTools/'>MPTools</a><br/> <a href='morbid/'>morbid</a><br/> <a href='Morelia/'>Morelia</a><br/> <a href='morse/'>morse</a><br/> : : : </body></html>
MPTools/
, что означает наличие проекта в каталоге. Страница, на которую ведет ссылка, содержит ссылки на все относящиеся к проекту ресурсы:
- ссылки на все архивы с кодом для распространения, хранящиеся на PyPI
- ссылки на все домашние страницы проекта, заданные в файле
Metadata
, для каждой зарегистрированной версии проекта - ссылки на файлы, заданные в файле
Metadata
, также для каждой версии проекта.
<html><head><title>Links for MPTools</title></head> <body><h1>Links for MPTools</h1> <a href="../../packages/source/M/MPTools/MPTools-0.1.tar.gz">MPTools-0.1.tar.gz</a><br/> <a href="http://bitbucket.org/tarek/mopytools" rel="homepage">0.1 home_page</a><br/> </body></html>
Такие инструменты, как установщики, при необходимости проверки наличия проекта могут поискать его в каталоге или просто проверить, существует ли страница с адресом http://pypi.python.org/simple/НАЗВАНИЕ_ПРОЕКТА/
.
Этот протокол имеет два недостатка. Во-первых, на данный момент каталог PyPI работает на одном сервере, и, хотя разработчики обычно имеют локальные копии его содержимого, мы сталкивались с несколькими случаями недоступности сервера за последние два года, что приводило к остановке работы с установщиками, использующими PyPI для получения списка зависимостей, необходимого для сборки проекта. Например, при сборке приложения Plone генерируется несколько сотен запросов к каталогу PyPI для получения всех необходимых данных, поэтому каталог PyPI в некоторых случаях может оказаться единой точкой отказа.
Во-вторых, в тех случаях, когда архивы для распространения не хранятся на сервере PyPI и на странице проекта приводится ссылка для их скачивания, установщикам приходится переходить по ссылке и рассчитывать на работоспособность стороннего сервера и наличие необходимого архива на этом сервере. Эти неопределенности снижают надежность функционирования процесса сборки при работе с простым протоколом каталога.
<<< import xmlrpclib <<< import pprint <<< client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') <<< client.package_releases('MPTools') ['0.1'] <<< pprint.pprint(client.release_urls('MPTools', '0.1')) [{'comment_text': &rquot;, 'downloads': 28, 'filename': 'MPTools-0.1.tar.gz', 'has_sig': False, 'md5_digest': '6b06752d62c4bffe1fb65cd5c9b7111a', 'packagetype': 'sdist', 'python_version': 'source', 'size': 3684, 'upload_time': <DateTime '20110204T09:37:12' at f4da28>, 'url': 'http://pypi.python.org/packages/source/M/MPTools/MPTools-0.1.tar.gz'}] >>> pprint.pprint(client.release_data('MPTools', '0.1')) {'author': 'Tarek Ziade', 'author_email': 'tarek@mozilla.com', 'classifiers': [], 'description': 'UNKNOWN', 'download_url': 'UNKNOWN', 'home_page': 'http://bitbucket.org/tarek/mopytools', 'keywords': None, 'license': 'UNKNOWN', 'maintainer': None, 'maintainer_email': None, 'name': 'MPTools', 'package_url': 'http://pypi.python.org/pypi/MPTools', 'platform': 'UNKNOWN', 'release_url': 'http://pypi.python.org/pypi/MPTools/0.1', 'requires_python': None, 'stable_version': None, 'summary': 'Set of tools to build Mozilla Services apps', 'version': '0.1'}
Недостатком этого подхода является тот факт, что часть передаваемой посредством API XML-RPC информации следовало бы хранить в статических файлах и предоставлять на странице проекта по простому протоколу каталога для упрощения работы клиентских инструментов. Это решение позволило бы также сократить объем дополнительной работы, выполняемой PyPI для обработки этих запросов. Неплохо иметь доступ к динамически изменяющимся данным, таким, как количество загрузок архива для распространения для их публикации на специализированном веб-сервисе, но не имеет смысла использовать две различные службы для для получения статических данных, относящихся к проекту.
Далее: 14.3.4. Архитектура системы установки Python