05.12 Пакетирование
Для семинара понадобится решение предыдущего Д/З или любой проект с приложением на Python, в котором есть:
- сборка перевода
- работающий перевод
- (если успеем) сборка документации
- Этот проект надо скопировать как «Задачу 0»
FIXME не раскрыта тема зависимостей между пакетами. Нужен и разговор о них, и игрушечный пример, где "наш" wheel зависит от другого и притягивает его при установке.
Фактически на практикуме мы решаем будущее Д/З (почти)
«Дистрибутив исходников» (aka sdist) — это содержимое рабочей копии
- + «Уникальные» генераты, которые нельзя изготовить в произвольном окружении (например, растровые картинки из фотошопных исходников).
- + «Информационные» генераты — например, сформатированная HTML-документация по тому, как вести разработку в проекте
Управляется файлом MANIFEST.in и python -m build --sdist (оно же … -s)
Структура pyproject.toml (при сборке с помощью setuptools + build)
ArbitTranslate и GradeProject2021
FIXME: добавить в GradeProject зависимости
Добавить в dodo.py цель sdist, которая вызывает python -m build --sdist
- Проверить, что в дистрибутив попадает всё содержимое рабочей копии, и не попадают генераты
«Бинарный дистрибутив» (aka bdist, точнее, bdist-wheel или просто wheel) — это набор для установки и эксплуатации в специальном формате (в действительности — просто zip с пакетом и метаинформацией)
- Модули
- Файлы данных (например, перевод)
- Метаинформация, которую подкладывает система сборки
Управляется файлом pyproject.html
Для работоспособности wheel каталоги с данными (например, переводы) должны лежать внутри модуля — см. ArbitTranslate
Все не-python файлы указываются в секции [tool.setuptools.package-data]
Добавить в dodo.py цель wheel, которая вызывает python -m build --wheel и формирует один дистрибутив на клиент и сервер
- Проверить, что колесо устанавливается в чистое окружение
Проверить, что клиент и сервер работают, и в сервере работает перевод
FIXME вначале оформить запуск приложения не как точку входа, а "обыкновенно" через python -m (иначе следующая упражненька сразу по двум темам)
Оформить запуск приложения как точку входа
(если успеем) Сгенерировать документацию и добавить её в пакет
Открыть её посредством webbrowser.open() какой-нибудь новой командой приложения (например, help ☺)
TODO в 2024-м в Ubuntu были проблемы с запуском (какое-то ограничение по безопасности); ещё сложнее для wsl
Д/З
Задача_1. Пакетирование для MUD (частично сделано в классе, но рекомендуется не торопиться и переделать аккуратно)
Скопировать решение Задачи_1 с предыдущего занятия. Сделать коммит. Работать на ветке work.
Реализовать в клиенте команду documentation с вызовом браузера посредством webbrowser.open(), которая показывает сгенерированную документацию
сделать pyproject.toml, содержащий описание общего пакета с клиентом и сервером
описание эксплуатационных зависимостей (cowsay-python и др. используемых пакетов)
- описание собственно содержимого пакета:
файл(ы) *.py
- скомпилированный перевод
txt-файл с дополнительным монстром
- сгенерированная документация
- если в состав конкретной реализации входят ещё какие-то файлы, нужные для запуска, то и они
- указание точек входа для генерации двух сценариев — запуск сервера и запуск клиента
Предусмотреть описание сборочных зависимостей (например, в секции [dev-packages] Pipfile-а или в requirements-dev.txt)
- проверить установку пакета и запуск клиента и сервера:
в двух отдельных pipenv-окружениях
в едином pipenv-окружении
- (в обоих случаях окружение создаётся заново)