Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Архитектура системы управления пакетами в Python

Глава 14 из 1 тома книги "Архитектура приложений с открытым исходным кодом".

Оригинал: Python Packaging
Автор: Tarek Ziade
Дата публикации: 7 Июня 2012 г.
Перевод: А.Панин
Дата публикации перевода: 3 апреля 2013 г.

Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.


14.3 Современная архитектура системы управления пакетами

14.3.3. Архитектура PyPI

Процесс работы PyPI
Рисунок 14.3: Процесс работы PyPI

Как было сказано ранее, PyPI является центральным каталогом проектов на языке Python, с помощью которого люди могут просматривать существующие разделенные на категории проекты или регистрировать свои работы. Архивы с исходным кодом и бинарными файлами для распространения могут быть загружены и добавлены к существующему проекту, после чего становится возможным их скачивание для установки или изучения. PyPI также предоставляет веб-сервисы, которые могут использоваться такими инструментами, как установщики.

Регистрация проектов и загрузка архивов

Регистрация проекта в каталоге 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
Каждый зарегистрированный проект получает веб-страницу, содержащую HTML-версию метаданных, и создатели пакетов могут загружать архивы для распространения в PyPI с помощью команды 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 используется ссылка MPTools/, что означает наличие проекта в каталоге. Страница, на которую ведет ссылка, содержит ссылки на все относящиеся к проекту ресурсы:
  • ссылки на все архивы с кодом для распространения, хранящиеся на PyPI
  • ссылки на все домашние страницы проекта, заданные в файле Metadata, для каждой зарегистрированной версии проекта
  • ссылки на файлы, заданные в файле Metadata, также для каждой версии проекта.
Страница проекта MPTools содержит следующие ссылки:
<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 и на странице проекта приводится ссылка для их скачивания, установщикам приходится переходить по ссылке и рассчитывать на работоспособность стороннего сервера и наличие необходимого архива на этом сервере. Эти неопределенности снижают надежность функционирования процесса сборки при работе с простым протоколом каталога.

Целью простого протокола каталога является передача установщикам списка ссылок, необходимых им для установки проекта. С помощью этого протокола не передаются метаданные проекта; напротив, существуют методы XML-RPC для получения дополнительной информации о зарегистрированных проектах.
<<< 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