Poetry: новый менеджер зависимостей в Python
В последнее время в экосистеме Python часто стали появляться инструменты для управления зависимостями. Оно понятно, стандартный pip уже не отвечает современным требованиям: неудобная работа с зависимостями, много ручной работы при подготовке пакетов, проблемы при установке и обновлении и много чего другого.
С недавних пор я начал использовать новый менеджер под названием Poetry. Именно о нём сегодня пойдёт речь.
Функциональные возможности Poetry:
- Управление зависимостями через toml файл (прощай, requirements.txt)
- Автоматическое создание изолированного виртуального окружения Python (теперь не нужно для этого вызывать virtualenv)
- Удобное создание пакетов (отныне не нужно
копипаститьсоздавать setup.py каждый раз) - poetry.lock файл для фиксирования версий зависимостей
А особенно радует тандем при работе с pyenv. О pyenv я писал три года назад.
Установка
Исходный код проекта лежит на github. Для установки необходимо выполнить команду:
curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
Если установка прошла успешно, то убедиться в этом можно вызвав:
$ poetry --version
Poetry 0.12.8
Стартуем!
Создаём новый проект my-demo-project:
$ poetry new my-demo-project
Заходим в папку:
$ cd my-demo-project/
~/my-demo-project$ ls
README.rst my_demo_project pyproject.toml tests
Poetry автоматически создал все необходимые файлы для будущего пакета, но наибольший интерес представляет файл с названием pyproject.toml, этот файл можно рассматривать как продвинутую альтернативу старичку requirements.txt. Взглянем на содержимое:
[tool.poetry]
name = "my-demo-project"
version = "0.1.0"
description = ""
authors = ["Your Name you@example.com"]
[tool.poetry.dependencies]
python = "^3.6"
[tool.poetry.dev-dependencies]
pytest = "^3.0"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
Формат файла TOML. Раздел tool.poetry предназначен для описания проекта: название, версия, краткая информация о проекте и т.д. Далее следует tool.poetry.dependencies, именно здесь будут указаны все production зависимости. Их можно указать вручную (привет, requirements.txt), но мы так делать не будем (привет, npm!). Раздел tool.poetry.dev-dependencies предназначен для зависимостей во время разработки (привет, pytest, tox!)
Добавляем зависимости
Давайте добавим к проекту зависимость в виде Luigi.
~/my-demo-project$ poetry add luigi==2.8.0
Creating virtualenv my-demo-project-py3.6 in /home/user/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (24.1s)
Package operations: 12 installs, 0 updates, 0 removals
Writing lock file
- Installing docutils (0.14)
- Installing lockfile (0.12.2)
- Installing six (1.11.0)
- Installing atomicwrites (1.2.1)
- Installing attrs (18.2.0)
- Installing more-itertools (4.3.0)
- Installing pluggy (0.8.0)
- Installing py (1.7.0)
- Installing python-daemon (2.1.2)
- Installing tornado (4.5.3)
- Installing luigi (2.8.0)
- Installing pytest (3.10.1)
Обратите внимание, что Poetry автоматически создал виртуальное окружение через virtualenv при добавлении пакета (т.к. ранее оно не было создано). Все окружения находятся по пути ~/.cache/pypoetry/virtualenvs
Если снова открыть pyproject.toml, то можно увидеть новую запись в разделе зависимостей:
[tool.poetry.dependencies]
python = "^3.6"
luigi = "=2.8.0"
Всю "грязную" работу за нас делает Poetry. Чтобы добавить зависимость для разработки достаточно указать флаг —dev:
$ poetry add tox --dev
Using version ^3.5 for tox
Updating dependencies
Resolving dependencies... (6.3s)
Package operations: 4 installs, 0 updates, 0 removals
Writing lock file
- Installing filelock (3.0.10)
- Installing toml (0.10.0)
- Installing virtualenv (16.1.0)
- Installing tox (3.5.3)
Смотрим содержимое pyproject.toml ещё раз:
[tool.poetry.dev-dependencies]
pytest = "^3.0"
tox = "^3.5"
Чтобы удалить зависимость нужно выполнить:
~/my-demo-project$ poetry remove luigi
Сборка пакета
Отныне забудьте про головную боль с ручным созданием setup.py, прописыванием туда всех зависимостей и запоминанием команд для сборки через pip. Всё стало в разы проще. Чтобы собрать python пакет выполните:
~/my-demo-project$ poetry build
Building my-demo-project (0.1.0)
- Building sdist
- Built my-demo-project-0.1.0.tar.gz
- Building wheel
- Built my_demo_project-0.1.0-py3-none-any.whl
В папке dist будут сформированы пакеты. Чтобы поделиться своим творением с другими разработчиками, например через pypi, выполните:
~/my-demo-project$ poetry publish
Окружение
Для активации виртуального окружения необходимо выполнить команду:
~/my-demo-project$ poetry shell
Вывод
Проект Poetry появился 28 февраля 2018 года, последняя версия 0.12.8. Инструмент молодой, но перспективный и быстроразвивающийся. Уже сейчас он на голову выше старичка pip и по функциональным возможностям и по удобству использования. Советую вам его попробовать и поделиться мнением в комментариях к этой статье. За более подробной информацией об инструменте советую заглянуть на сайт с документацией.