Пакетирование и деплоймент

Что умеет pip install:

  1. Скачать исходники, собрать и установить их
    • Нужны сборочные зависимости
    • В случае модулей на Си это может быть очень непросто

      • ⇒ часто встречаются прихаканные в исходниках бинарники (например, скомпилированные переводы, а то и прямо исполняемые файлы, как в cmake)

  2. Скачать готовый пакет
    • Под разные архитектуры и разные версии Python
    • В случае модулей на Си — ещё и под разные ОС
    • ⇒ универсальный формат Wheel (pep-0427)

Публиковать нужно и то, и то (лицензия, вопросы доработки и т. п.), а вот рассчитывать на сборку «на месте» не стоит.

Сборка

Setuptools

pyproject.toml

Особенность TOML: однострочный и секционированный форматы представления одних и тех же данных (отсюда и далее

Особенность pyproject.toml: простой и сложный варианты описания:

Reference implementation: build

В репозитории с примером

Что должно входить в wheel / sdist?

Более простой пример, в котором:

TODO: Научиться запускать doit прямо из setuptools

Пакетные зависимости

Эксплуатационные зависимости
Набор модулей, необходимых для эксплуатации приложения
  • Обязательные и предполагаемые
  • Включённые в python-инфраструктуру и все остальные (с этим проблема)
Сборочные зависимости

Набор модулей и ПО, необходимый для разработки

  • + Средства сборки

  • + Средства тестирования

  • - Возможно, часть эксплуатационных зависимостей замещена квазиобъектами

Отслеживание зависимостей

∃ Более сложный инструмент ­— poetry, но он предписывает определённый workflow и скрывает многие действия под капотом, попробуем разобраться на нижнем уровне.

  1. Скопировать в чистое окружение и тупо запускать и добавлять в зависимости всё, из-за отсутствия чего падает)
  2. Сделать pip freeze и угадать, что из этого всего понадобится при запуске

  3. Соблюдать дисциплину с помощью pipenv:

    • Для установки чего не попадя — pip install что ни попадя

    • Для установки эксплуатационных зависимостей — pipenv install эксплуатационные зависимости

      • записывается в секцию [packages] файла Pipfile

      • pipenv install пакет обновляет Pipfile, даже если до этого был сделан pip install пакет

    • Для установки сборочных зависимостей — pipenv install -d сборочные зависимости)

      • Обновляет секцию [dev-packages] в Pipfile

При формировании дистрибутива / архива исходников

  1. Эксплуатационные зависимости

    • Хранятся в pyproject.toml

    • можно отследить по наличию import-ов в модуле.
      • В т. ч. автоматически, но
      • Есть прорва инструментов, ни одного годного

      • Часть из них импортит внутренности pip, что запрещено ☹ (пример: pip-check-reqs, оно пока работает)

    • Самый адекватный — поисковик python3 зависимостей в сборочнице ALT Linux Team

      • Запуск find project -name \*.py | python3 /usr/lib/rpm/python3.req.py

      • Ждём релиза в качестве независимого модуля!

  2. Сборочные зависимости

    • Хранятся в pyproject.toml, потому что определяют инструменты сборки

    • Можно отследить путём трассировки import-ов.

    • <!> Но инструмента такого, похоже, нет!

Прототип инструмента, отслеживающего сборочные заивсимости

Пример такого инструмента: pip запускается из командной строки. Выдаёт довольно адекватную информацию, как минимум про репозиторий с примером

  1. Составить словарь: какому из установленных пакетов какой файл принадлежит ( <!> эта задача почему-то ещё не решена)

    • Учитывать только пакеты, установленные непосредственно, а не по зависимостям (например, с помощью pip list --not-required)

  2. Запустить все инструменты сборки и тестирования с трассировкой (PYTHONVERBOSE=import python … или python -v …)

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

<!> Возможны ситуации, когда для сборки требуется инструмент, который был поставлен автоматом по зависимости, а то, что его требовало, для сборки не нужно.

Строгие VS нестрогие зависимости на версии

Pipfile vs requirements.txt

Точки входа

Д/З

Обеспечить в семестровом проекте:

Это весь семестровый проект, готовый к сдаче!

LecturesCMC/PythonDevelopment2023/12_Packaging (последним исправлял пользователь FrBrGeorge 2023-04-28 20:52:29)