Зачем это нужно?
Когда я начал учиться проектировать информационные системы на базе микро сервисов, то обнаружил, что часто требуется при построении архитектуры использовать в разных микро сервисах в рамках одного большого проекта одни и те же классы. Например, класс для работы с нашим хранилищем Minio s3, или класс для работы с RabbitMQ, класс для работы с шиной данных и другие классы.
После того, как я некоторое время потаскал эти файлы с классами из проекта в проект, смог убедиться в том, что это очень неудобно и быстро надоедает. Идеальным вариантом было бы иметь компонент, который инсталлируется в Docker во время установки зависимости из файла requirements.txt.
В PHP для таких вещей удобно использовать композер. А как именно упаковать компонент в транспортный пакет для Python, мне как раз и предстояло разобраться.
В целом, то, что я описал тут, можно найти на https://packaging.python.org/en/latest/tutorials/packaging-projects/#uploading-your-project-to-pypi
Только там описано в общем виде, я же пишу эту шпаргалку для себя с использованием реального компонента.
Подготовка компонента для упаковки
Первым делом, необходимо упаковать свой компонент в разворачивающийся дистрибутив.
Для этого, создаем папочку со своим дистрибутивом. В моем примере я буду упаковывать в транспортный пакет класс для работы с RabbitMQ.
Для начала, я создаю папку rabbit_hadler_kvg и в ней создаю 2 папки с двумя файлами в каждой:
Теперь по каждому из этих компонентов. Первое rabbit_handler_kvg/rabbit_handler_kvg.py — это сам класс, который мы хотим упаковать.
Файл rabbit_handler_kvg/init.py — в нем мы подключаем различные классы при инициализации.
Второе, setup.py — файлик с данными о пакете. В нем содержится информация о пакете, а также массив install_requires с зависимостями, необходимыми для установки пакета.
В моем случае, класс выглядит таким образом:
В файле README.md прописываете инструкции о том, как использовать ваш пакет. Даже если делаете компонент чисто для себя, обязательно напишите инструкцию, как его использовать, т.к. даже через 3 месяца можете не вспомнить сразу и придется опять читать свой код, чтобы вспомнить, как его подключить.
Итак, теперь у нас все готово, чтобы создать дистрибутив. Давайте создадим его!
Вводим в терминале команду
python setup.py sdist bdist_wheel
Эта команда создаст папку dist
с дистрибутивом. В моем случае, это 2 файла:
В принципе, чтобы установить и пользоваться моим пакетом, уже можно брать любой из этих файлов и устанавливать, например с помощью команды:
pip install rabbit_handler_kvg-1.0.0-py3-none-any.whl
Это будет работать. Однако, наша задача не просто установить класс, который будет работать, а класс, который можно будет подключить в любом проекте, установив одной командой и без необходимости таскать эти файлы из места в место.
Для того, чтобы загрузить это в сервис pypi.org нужно при включенной авторизации по API токену создать файлик .pypirc
Если все настроено правильно и файл располагается по пути
В операционных системах Linux и macOS это обычно /home/ваше_имя_пользователя/.pypirc, а в Windows - C:\Users\ваше_имя_пользователя\.pypirc.
То команда
twine upload dist/*
загрузит ваш компонент на сервер.
И это круто, т.к. теперь вы сможете подключать компонент, как и любую другую стандартную библиотеку командой
pip install rabbit-handler-kvg
Класс создан для расширения, т.е. в нем есть все необходимое для расширения в случае необходимости дописать свои необходимые методы.