Библиотека сайта 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, позволяя людям и таким используемым ими инструментам, как установщики, просматривать параметры проекта с помощью веб-страниц или веб-сервисов.
Рисунок 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'])
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