Построение и исследования графа python3-зависимостей в репозитории Sisyphus (Данила Загайнов, OSSDEVCONF-2023)

Материал из 0x1.tv

Докладчик
Данила Загайнов

В работе рассматриваются зависимости и provides-ы python3-пакетов, а также выделение подпакета из исходного python3-пакета.

Видео

Презентация

Thesis

py3dephell

Данный пакет предоставляет модули для работы с зависимостями и provides-ами python3-пакетов.

Его компонент py3prov на основе переданных имён файлов и каталогов определяет provides-ы рассматриваемого пакета с учётом .pth файлов и корректности получаемых имен.

Для выявления же зависимостей используется py3req. Данный модуль читает AST-дерево переданного скрипта, написанного на python3, или же парсит заголовок ELF-файла, для выявления соответствующих зависимостей.

Для определения self-provides py3req использует py3prov.

Компоненты rpm-build-python3 уже используют данный пакет для формирования зависимостей и provides-ов rpm-пакетов в репозитории Sisyphus.

В ходе внедрения py3dephell было выявлено множество (свыше 400) ложных provides-ов у rpm-пакетов, а также ошибки в упаковке ряда пакетов, вследствие чего, например, порождались зависимости между основным пакетом и подпакетом с тестами.

Также данные модули могут автоматически формировать requirements.txt, пригодного для использования утилитой pip.

В то же время была рассмотрена задача вынесения нежелательных зависимостей из пакета. Предполагается, что пользователь, задав набор ключевых модулей, сможет выделить из исходного пакета подпакеты, содержащие избыточные зависимости. Примером таких зависимостей могут служить зависимости на тесты, графический интерфейс, сеть и т. д.

Был предложен следующий алгоритм:

  1. Для заданного набора основных модулей формируется подпакет, содержащий их и их зависимости. Если в полученный подпакет попала одна из избыточных зависимостей, то распиливание для заданных наборов невозможно.
  2. Для вынесенных зависимостей строятся подпакеты, содержащие каждую из избыточных зависимостей, и модули, зависящие от них.
  3. Для образовавшихся подпакетов берутся их зависимости, которые ещё не попали ни в 1 из подпакетов. Если несколько подпакетов хотят один и тот же модуль, то его выносят в отдельный подпакет.



Примечания и ссылки