Библиотека сайта 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
