Библиотека сайта rus-linux.net
Архитектура системы управления пакетами в Python
Глава 14 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: Python Packaging
Автор: Tarek Ziade
Дата публикации: 7 Июня 2012 г.
Перевод: А.Панин
Дата публикации перевода: 3 апреля 2013 г.
Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
14.3 Современная архитектура системы управления пакетами
14.3.5. Setuptools, Pip и аналогичные проекты
Как упоминалось во введении, в рамках некоторых проектов предпринимались попытки исправления определенных недоработок пакета Distutils
с переменным успехом.
Вопрос зависимостей
Каталог PyPI позволяет разработчикам публиковать проекты на языке Python, содержащие несколько модулей для организации пакетов Python. Но в то же время проекты должны объявлять зависимости на уровне модулей с помощью директивы Require
. Оба подхода разумны, но вот их комбинация - нет.
Правильным решением было бы объявление зависимостей на уровне проекта, что и было сделано в проекте Setuptools
, добавившим эту функцию к Distutils
. Он также предоставлял сценарий easy_install
для автоматического получения и установки зависимостей путем поиска в каталоге PyPI. На практике зависимости уровня модулей никогда не использовались в полной мере, а вместо них использовались расширения Setuptools
. Но так как эти параметры были специфичными для Setuptools
и игнорировались Distutils
или PyPI, в рамках пакета Setuptools
был создан собственный стандарт, ставший решением, исправляющим недоработку в архитектуре системы управления пакетами.
Сценарию easy_install
приходится скачивать архив проекта и запускать сценарий setup.py
из его состава для получения необходимых метаданных, а также ему приходится повторять этот процесс для каждой зависимости. Граф зависимостей строится последовательно после каждого скачивания.
easy_install
также будет необходимо скачивать все архивы, ведь, как говорилось ранее, публикуемые с помощью PyPI метаданные зависят от платформы, которая использовалась для их загрузки и может отличаться от целевой платформы. Тем не менее, такая возможность установки проекта вместе с его зависимостями была достаточна в 90% случаев и была замечательной функцией. Поэтому пакет Setuptools
получил широкое распространение, хотя он и был подвержен другим недостаткам:
- Если установка зависимости проходила неудачно, не было возможности отката изменений, поэтому после установки проект мог остаться в нерабочем состоянии.
- Граф зависимостей строился в ходе установки пакетов, поэтому в случае обнаружения конфликта в ходе установки проект мог также остаться в нерабочем состоянии.
Вопрос удаления файлов
Setuptools
не предоставляет инструмента для удаления файлов, хотя его специфические метаданные и могут содержать список установленных файлов. Проект Pip
, с другой стороны, расширил метаданные Setuptools
для записи списка установленных файлов, и, таким образом добавил возможность удаления файлов. Однако, в данном случае использовался еще один набор специфических метаданных, поэтому отдельная установка Python должна была содержать:
- Метаданные
egg-info
отDistutils
в форме одного файла метаданных. - Метаданные
egg-info
отSetuptools
а форме директории с файлами метаданных с специфическими дляSetuptools
параметрами. - Метаданные
egg-info
отPip
в форме расширения предыдущих метаданных. - Любые метаданные, создаваемые системами управления пакетами системы.
Далее: 14.3.6. Как насчет файлов данных?