Автоматизация сборки
TODO Лекция слишком большая, надо распиливать. Видимо, какая-то сборка sdist/wheel останется тут, а вот что должно быть в них для деплоймента — уезжает на следующий раз; там же публикация в PyPI и публикация в Readthedocs…
Этапы формирования дистрибутива
- Разработка - Сборка генератов
- Тестирование
 
- Сборка дистрибутивов
- Публикация исходников
- Публикация дистрибутивов
- Генерат
- файл, получающийся в процессе сборки дистрибутива
- Целевой генерат: генерат, входящий в дистрибутив
- Промежуточный генерат: генерат, не входящий ни в какой дистрибутив
Генераты не хранятся в репозитории, однако некоторые из них (например, документация, скомпилированные переводы и т. п.) используются при публикации.
Автоматизация сборки
Как понятие «сборка» стало «оркестрацией»
- Интерпретируемые ЯП ⇒ нет понятия сборки 
- Малые проекты: всё вручную
- Большие проекты: всё на CI-сервере - Документация
- Тесты
- Проверка синтаксиса
 
Как следствие: использование инструментов не по назначению:
- Tox (автоматизация тестирования) - Сборку генератов можно представить как test suit-ы
- НО вообще-то tox не для этого
 
- Git hooks - одноуровневая (?) схема «стимул-реакция»
- на чём писать? некроссплатформенно!
 
- Github actions - Достоинство и оно же недостаток: на машину разработчика даже инструментальные зависимости ставить не надо
- ⇒ работа превращается в магические пляски над чёрным ящиком
- некроссплатформенность не имеет (?) значения (модно писать 10050 скриптов для 100500 ОС то на шелле, то на cmd)
 
Универсальный инструмент сборки
- Классический вариант: Make (его даже использует Sphinx). - off-python зависимость
- некроссплатформенно
 
- Вариант, рекомендуемый Tox: Invoke - Достоинство и оно же недостаток: описание действий на самом Python (синтаксически шумно)
- Я увидел такую конструкцию в примере: c.run("rm -rf target") — off-python некроссплатформенная зависимость? 
 
- …
- (Задача на самом деле сложная)
На примере DoIt
- Архитектура: - Задания - Действия
- Обновление генератов (зависимость на файлы) - Есть возможность определять, что такое «новое»
 
- Составные задания (зависимость на задания)
 
 
- Задания 
- Позволяет запускать задания на языке командной строки
- Часто используемые примитивы на python
- Синтаксис Python (это и есть программа на Python) 
В нашем случае нуждается в автоматизации:
- Сборка документации
- Обновление и компиляция переводов
- Запуск тестов (в т. ч. проверка стиля)
- Сборка исходного дистрибутива
- Сборка бинарного дистрибутива (собственно модуля)
- (ещё не сделано, но тоже нужно) Публикация: - Бинарного дистрибутива
- Исходного дистрибутива
- Документации
 
В целом те же проблемы: шумно из-за python вместо декларативного синтаксиса, внешние команды и т. п.), но
- Развесистый workflow
- python-активности, в т. ч. уже готовые (типа того же rm)
Сборка
Немного истории:
- Античность
- Distutils — встроенный в Python инструмент 
- Появление Python Packaging Authority - Setuptools — развитие Distutils - a. k. a. setup.py 
 
 
- Появление других инструментов сборки: Poetry, pip-tools, PyBuilder и т. п. 
Сборка бинарных и исходных дистрибутивов
Что умеет pip install:
- Скачать исходники, собрать и установить их - Нужны сборочные зависимости
- В случае модулей на Си это может быть очень непросто - ⇒ часто встречаются прихаканные в исходниках бинарники (например, скомпилированные переводы)
 
 
- Скачать готовый пакет
Публиковать нужно и то, и то (лицензия, вопросы доработки и т. п.)
Пример: python -m build и что он создаёт
- sdist
- wheel
- Для того, чтобы вместе с модулем упаковать какие-то дополнительные файлы, например, скомпилированные переводы, необходимо: - Чтобы после сборки эти файлы (неважно, генераты или нет) оказались в каталоге с модулем
- В секции options.package_data файла setup.cfg описать, какие файлы какому пакету принадлежат 
 
- Для того, чтобы упаковать в исходный дистрибутив дополнительные файлы (переводы, тесты и т. п.), их надо перечислить в заготовке файла-манифеста MANIFEST.in. Некоторые файлы включаются автоматически. - Имеет смысл проследить за тем, чтобы в исходном дистрибутиве было всё, что лежит в репозитории
 
Пример
Д/З
Обеспечить в семестровом проекте:
- Автоматизацию выгонки целевых генератов (документация, перевод, иное)
- Сборку wheel
- Сборку архива с исходниками
