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

UnixForum





Библиотека сайта 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
Пакет Distutils исполняет такие дополнительные команды, как:
  • upload для загрузки архива с кодом для распространения в сетевой репозиторий,
  • register для регистрации метаданных проекта в сетевом репозитории без обязательной загрузки архива с кодом для распространения,
  • bdist для создания бинарного пакета для распространения, а также
  • bdist_msi для создания установочного пакета с расширением .msi для Windows.

Также возможно получение дополнительной информации о проекте с помощью других параметров командной строки.

Таким образом, установка проекта или получение информации о нем всегда осуществляется путем использования пакета Distutils с помощью данного сценария. Например, для получения названия проекта можно использовать следующую команду:
$ python setup.py --name
MyProject

Следовательно, сценарий setup.py является инструментом для взаимодействия с проектом, независимо от того, нужно ли собрать, опубликовать или установить пакет. Разработчик описывает содержимое своего проекта с помощью параметров, передаваемых функции, а также использует этот сценарий для выполнения всех задач по работе с пакетом. Данный сценарий также используется для установки проекта в целевую систему.

Функции модуля setup.py
Рисунок 14.1: Функции модуля setup.py

Использование одного и того же модуля Python для упаковки, распространения и установки проекта является одним из главных дефектов архитектуры пакета 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