Библиотека сайта rus-linux.net
Архитектура системы управления пакетами в Python
Глава 14 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: Python Packaging
Автор: Tarek Ziade
Дата публикации: 7 Июня 2012 г.
Перевод: А.Панин
Дата публикации перевода: 3 апреля 2013 г.
Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
14.3 Современная архитектура системы управления пакетами
Пакет Distutils, поставляемый в составе стандартной библиотеки Python подвержен описанным выше проблемам. Так как он является стандартным пакетом, разработчики либо используют его, мирясь с его дефектами, либо используют такие более сложные инструменты, как Setuptools, использующий Distutils в качестве основы и предоставляющий дополнительные функции, или Distribute, являющийся форком Setuptools. Также существует Pip, являющийся более сложным инструментом, созданным на основе Setuptools.
Однако, все эти новые инструменты основываются на Distutils и наследуют его недостатки. Попытки исправления недостатков Distutils предпринимались ранее, но его код настолько тесно связан с кодом других инструментов, что любое изменение даже внутренних интерфейсов вело к потенциальной регрессии всей экосистемы управления пакетами в Python.
Исходя из этого, мы решили прекратить работу над Distutils и начать разработку Distutils2 на основе той же кодовой базы, не особо беспокоясь об обратной совместимости. Для понимания того, что и как было изменено, давайте рассмотрим подробнее архитектуру пакета Distutils.
14.3.1. Краткое описание и дефекты архитектуры Distutils
Пакет Distutils поддерживает команды, каждая из которых реализована в виде класса с методом run, который может быть вызван с различными параметрами. В Distutils также реализован класс Distribution, содержащий глобальные значения, к которым может обратиться любой класс с реализацией команды.
Distutils разработчик добавляет в проект единственный модуль Python, традиционно называемый setup.py. В данном модуле реализуется обращение к главной точке входа в Distutils: функции setup. Эта функция принимает множество параметров, которые впоследствии хранятся с помощью экземпляра класса Distribution и используются классами команд. Ниже приведен пример передачи нескольких стандартных параметров, таких, как название и версия проекта, а также списка модулей проекта:
from distutils.core import setup setup(name='MyProject', version='1.0', py_modules=['mycode.py'])
Distutils, как sdist, которая создает архив для распространения исходного кода и размещает его в директории dist:
$ python setup.py sdist
install:
$ python setup.py install
uploadдля загрузки архива с кодом для распространения в сетевой репозиторий,registerдля регистрации метаданных проекта в сетевом репозитории без обязательной загрузки архива с кодом для распространения,bdistдля создания бинарного пакета для распространения, а такжеbdist_msiдля создания установочного пакета с расширением.msiдля Windows.
Также возможно получение дополнительной информации о проекте с помощью других параметров командной строки.
Distutils с помощью данного сценария. Например, для получения названия проекта можно использовать следующую команду:
$ python setup.py --name MyProject
Следовательно, сценарий setup.py является инструментом для взаимодействия с проектом, независимо от того, нужно ли собрать, опубликовать или установить пакет. Разработчик описывает содержимое своего проекта с помощью параметров, передаваемых функции, а также использует этот сценарий для выполнения всех задач по работе с пакетом. Данный сценарий также используется для установки проекта в целевую систему.
Рисунок 14.1: Функции модуля setup.py
Distutils. Например, если вы хотите получить название проекта lxml, сценарий setup.py выполнит множество действий помимо ожидаемого вывода строки:
$ python setup.py --name Building lxml version 2.2. NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c' needs to be available. Using build configuration of libxslt 1.1.26 Building against libxml2/libxslt in the following directory: /usr/lib/lxml
Данная команда может даже не работать в некоторых проектах, так как их разработчики предполагают, что сценарий setup.py используется только для установки, поэтому остальные функции пакета Distutils будут использоваться ими только в период разработки. Множество вариантов использования сценария setup.py может просто привести в замешательство.
Далее: 14.3.2. Метаданные и PyPI
