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

UnixForum





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

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

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

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

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


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

14.3.2. Метаданные и PyPI

Во время создания архива с исходным кодом для распространения пакет Distutils создает файл Metadata, соответствующий стандарту PEP 3141. Он содержит статическую копию метаданных, представленных такими полями, как название проекта или версия релиза. Основные поля файла метаданных:
  • Name: Название проекта.
  • Version: Версия релиза.
  • Summary: Краткое описание проекта в одной строке.
  • Description: Подробное описание проекта.
  • Home-Page: Строка URL для доступа к домашней странице проекта.
  • Author: Имя автора.
  • Classifiers: Классификаторы для проекта. Python использует список классификаторов для указания на лицензию, готовность релиза (alpha, beta, final) и другие параметры.
  • Requires, Provides и Obsoletes: Используются для указания зависимости от модулей.

Эти поля достаточно просто поставить в соответствие эквивалентным полям, используемым в других системах управления пакетами.

Каталог пакетов Python (The Pyhon Package Index - PyPI)2 является аналогичным CPAN центральным репозиторием пакетов, позволяющим регистрировать проекты и публиковать релизы с помощью команд пакета Distutils register и upload. С помощью команды register создается файл Metadata, который отправляется в PyPI, позволяя людям и таким используемым ими инструментам, как установщики, просматривать параметры проекта с помощью веб-страниц или веб-сервисов.

Репозиторий PyPI
Рисунок 14.2: Репозиторий PyPI

Вы можете просмотреть проекты, выбрав классификаторы из поля Classifiers и получить имя автора и строку URL для доступа к домашней странице проекта. Между тем, поле Requires может быть использовано для указания зависимостей проекта от модулей Python. Параметр requires может быть использован для добавления модуля в поле Requires метаданных проекта:
from distutils.core import setup

setup(name='foo', version='1.0', requires=['ldap'])

Объявление зависимости от модуля ldap носит исключительно декларативный характер: никакой из инструментов или обработчиков не будет проверять наличие данного модуля. Данное решение было бы удачным в том случае, если бы Python использовал зависимости на уровне модулей, задаваемые с помощью ключевого слова require аналогично Perl. После этого задача сценария установки заключалась бы в поиске зависимостей в PyPI и установке их; таким образом функционирует CPAN. Но это не возможно в Python, так как модуль с именем ldap может использоваться в любом проекте Python. Так как пакет Distutils позволяет публиковать проекты, которые могут содержать по нескольку пакетов и модулей, данное поле метаданных полностью бесполезно.

Другим дефектом файлов Metadata является тот факт, что они создаются с помощью сценария Python, следовательно, являются специфичными для платформы, на которой происходило создание. Например, проект, предоставляющий специфичные для Windows возможности, может использовать следующий файл setup.py:
from distutils.core import setup

setup(name='foo', version='1.0', requires=['win32com'])
Но этот файл предполагает работу проекта только под управлением Windows даже в том случае, когда предоставляются переносимые функции. Одним способом решения этой проблемы является использование специфичного для Windows параметра requires.
from distutils.core import setup
import sys
if sys.platform == 'win32':
    setup(name='foo', version='1.0', requires=['win32com'])
else:
    setup(name='foo', version='1.0')

Это объявление частично решает проблему. Вспомните о том, что сценарий используется для создания архивов с исходным кодом, которые впоследствии публикуются с помощью PyPI. Это значит, что статический файл Metadata, отправляющийся для публикации в PyPI, зависит от платформы, на которой происходит его формирование. Другими словами, нет способа для указания в поле метаданных того, что пакет зависим от платформы.


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