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