Создание и публикация пакета в PyPI
В экосистеме Python существует много систем для сборки и публикации пакетов. Здесь описывается самый простой и, насколько это возможно, “официальный и современный” на данный момент способ. Для примера используется консольное приложение на Python, которое можно будет как запускать из командной строки, так и использовать как библиотеку в других приложениях.
Примером пакета, собранного этим способом, является todoist-to-todotxt
:
Подготовка
Сборка будет проходить в Ubuntu. Для работы понадобится Python 3, pip (пакетный менеджер) и virtualenv (для изолированной сборки пакета):
# apt install python3-pip python3-venv
Также нужна система для сборки проектов Python:
$ pip install --upgrade build
И утилита для загрузки пакетов в PyPI:
$ pip install --upgrade twine
Структура проекта
Будем создавать проект с названием project-a
. Для этого нужна следующая структура файлов:
Директория проекта:
|
|
- <2> Директория с исходным кодом проекта.
- <4> Пустой файл
\\__init__.py
для обозначения пакета. - <5> Главный файл с кодом.
- <6> Файл с описанием проекта.
- <7> Лицензия проекта (выбираем лицензию и копируем текст отсюда: https://choosealicense.com/).
- <8> Файл с описанием пакета (необходим для сборки).
Добавим простой код в main.py
, который выводит название проекта:
main.py:
|
|
Для описания сборки используется файл pyproject.toml
, который является “фронтендом” для разных систем сборки (в данном примере используется setuptools
).
pyproject.toml:
|
|
- <1> Описание выбранной системы сборки для пакета.
- <5> Мета-информация о пакете.
- <22> Название исполняемого файла, который будет создан для запуска скрипта.
Сборка
Запускаем сборку пакета из директории package-a
:
$ python -m build
В результате получим собранный пакет в директории dist
:
package_a-0.0.1-py3-none-any.whl
package-a-0.0.1.tar.gz
Публикация пакета
Для публикации сначала можно использовать тестовый репозиторий PyPI - TestPyPI. После того, как загрузка и установка пакета будут протестированы, по аналогичной схеме можно загружать пакет в PyPI.
Регистрируемся в TestPyPI, подключаем двухфакторную аутентификацию (без неё не будет работать загрузка пакетов) и создаём API token: https://test.pypi.org/manage/account/#api-tokens.
Теперь можно загрузить собранный пакет:
$ python -m twine upload --repository testpypi dist/*
Потребуется ввести имя - используется __token__
, и пароль - созданный API token.
После успешной загрузки можно установить загруженный пакет из репозитория:
$ pip install -i https://test.pypi.org/simple/ package-a
Далее, после завершения тестирования в TestPyPI, нужно зарегистрироваться в основном репозитории PyPI (и получить новый API token) и использовать аналогичные команды для загрузки и установки пакета:
$ python -m twine upload dist/*
$ pip install package-a