05.04 Пакетирование
Для семинара понадобится работающая Задача_0 по интернационализации или любой другой проект с пакетом Python, в котором есть:
- сборка перевода
запуск приложения вида python -m пакет
- работающий перевод
- Этот проект надо скопировать как «Задачу 0»
Фактически на практикуме мы решаем будущее Д/З (почти)
«Дистрибутив исходников» (aka sdist) — это содержимое рабочей копии
- + «Уникальные» генераты, которые нельзя изготовить в произвольном окружении (например, растровые картинки из фотошопных исходников).
+ «Информационные» генераты — например, сформатированная HTML-документация по тому, как вести разработку в проекте: её люди будут смотреть до сборки
Управляется файлом MANIFEST.in и python -m build --sdist (оно же … -s)
Структура pyproject.toml (при сборке с помощью setuptools + build)
Примеры: ArbitTranslate и GradeProject2021
Добавить в dodo.py цель sdist, которая вызывает python -m build --sdist Проверить, что в дистрибутив попадает всё содержимое рабочей копии (например, .po), и не попадают генераты (например, .mo)
«Бинарный дистрибутив» (aka bdist, точнее, bdist-wheel или просто wheel, он же .whl) — это набор для установки и эксплуатации в специальном формате (в действительности — просто zip с пакетом и метаинформацией)
- Модули
- Файлы данных (например, перевод)
FIXME напомнить (здесь, текстом), по какому пути pybabel кладет сгенерированный перевод. Иначе искать долго.
- Метаинформация, которую подкладывает система сборки
Управляется файлом pyproject.html
Для работоспособности wheel каталоги с данными (например, переводы) должны лежать внутри модуля — см. ArbitTranslate Все не-python файлы, которые надо положить в пакет, указываются в секции [tool.setuptools.package-data]
Добавить в dodo.py цель wheel, которая вызывает python -m build --wheel и формирует один дистрибутив на клиент и сервер - Проверить, что колесо устанавливается в чистое окружение
Проверить, что приложение там работает как python -m пакет с переводом и без
Эксплуатационные зависимости.
Добавить в приложение внешнюю зависимость (если её там нет) — например, наш любимый python-cowsay (выводить какое-нибудь сообщение без перевода). Оформить requirements.txt и динамическую зависимость как в GradeProject2021 Проверить, что python-cowsay автоматически устанавливается в окружение
Оформить запуск приложения как точку входа
Сборочные зависимости.
Добавить setuptools, build, doit и babel в dependency-groups.devel (по аналогии с GradeProject2021) Выйти из окружения (если вы в нём) и создать новое, например python3 -m venv /tmp/qq
Войти в это новое окружение (оно должно быть пустым, проверить), убедиться, что pip install --group devel ставит всё нужное и после этого doit wheel собирает пакет
Д/З
Задача_1. Пакетирование для MUD (частично сделано в классе, но рекомендуется не торопиться и переделать аккуратно)
Скопировать решение Задачи_1 с предыдущего занятия. Сделать коммит. Работать на ветке work.
Реализовать в клиенте команду documentation с вызовом браузера посредством webbrowser.open(), которая показывает сгенерированную документацию
сделать pyproject.toml, содержащий описание общего пакета с клиентом и сервером
описание эксплуатационных зависимостей (cowsay-python и др. используемых пакетов)
- описание собственно содержимого пакета:
файл(ы) *.py
- скомпилированный перевод
txt-файл с дополнительным монстром
- сгенерированная документация
- если в состав конкретной реализации входят ещё какие-то файлы, нужные для запуска, то и они
- указание точек входа для генерации двух сценариев — запуск сервера и запуск клиента
Предусмотреть описание сборочных зависимостей (например, в секции [dev-packages] Pipfile-а или в requirements-dev.txt)
- проверить установку пакета и запуск клиента и сервера:
в двух отдельных pipenv-окружениях
в едином pipenv-окружении
- (в обоих случаях окружение создаётся заново)
