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

UnixForum





Библиотека сайта 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 из его состава для получения необходимых метаданных, а также ему приходится повторять этот процесс для каждой зависимости. Граф зависимостей строится последовательно после каждого скачивания.

Даже если метаданные приняты в каталог PyPI и доступны в сети, сценарию easy_install также будет необходимо скачивать все архивы, ведь, как говорилось ранее, публикуемые с помощью PyPI метаданные зависят от платформы, которая использовалась для их загрузки и может отличаться от целевой платформы. Тем не менее, такая возможность установки проекта вместе с его зависимостями была достаточна в 90% случаев и была замечательной функцией. Поэтому пакет Setuptools получил широкое распространение, хотя он и был подвержен другим недостаткам:
  • Если установка зависимости проходила неудачно, не было возможности отката изменений, поэтому после установки проект мог остаться в нерабочем состоянии.
  • Граф зависимостей строился в ходе установки пакетов, поэтому в случае обнаружения конфликта в ходе установки проект мог также остаться в нерабочем состоянии.

Вопрос удаления файлов

Пакет Setuptools не предоставляет инструмента для удаления файлов, хотя его специфические метаданные и могут содержать список установленных файлов. Проект Pip, с другой стороны, расширил метаданные Setuptools для записи списка установленных файлов, и, таким образом добавил возможность удаления файлов. Однако, в данном случае использовался еще один набор специфических метаданных, поэтому отдельная установка Python должна была содержать:
  • Метаданные egg-info от Distutils в форме одного файла метаданных.
  • Метаданные egg-info от Setuptools а форме директории с файлами метаданных с специфическими для Setuptools параметрами.
  • Метаданные egg-info от Pip в форме расширения предыдущих метаданных.
  • Любые метаданные, создаваемые системами управления пакетами системы.

Далее: 14.3.6. Как насчет файлов данных?