Logo

dev-resources.site

for different kinds of informations.

UV как альтернатива Poetry

Published at
12/1/2024
Categories
python
poetry
uv
package
Author
dmkjfs
Categories
4 categories in total
python
open
poetry
open
uv
open
package
open
UV как альтернатива Poetry

Пакетных менеджеров для питона как-то слишком много. У этого, конечно, есть очевидная причина - скудность функционала pip, встроенного пакетного менеджера. Но всё равно внутренний перфекционист хочет простое решение из коробки. Установил питон - и сразу получаешь быстрый и удобный пакетный менеджер, и ещё желательно менеджер версий питона. Но вместо этого получаешь pip. Кто-то, конечно, его реально пользует, но всё-таки poetry, pdm, conda, pipenv или хотя бы pip-tools гораздо удобнее.

Ну окей, казалось бы - всем хорош poetry. Я сам использую его в большинстве проектов. Но установка зависимостей начинает казаться медленной - особенно при пересборке docker-контейнера. Плюс гемор с установкой самого poetry или со сменой версий питона - меняешь версию через, например, pyenv, а poetry при попытке пересоздания окружения выдает ошибку. Хотя предполагается что умеет работать с разными версиями питона. Решается, конечно, легко - через указание полного пути к интерпретатору, но всё равно костыли. Как и установка того же pyenv, и вообще работа с ним. А больше контролировать версии питона, вроде как, нечем.

И вот, в феврале появилось интересное решение от создателей Ruff. Пакетный менеджер UV, написанный на расте. Чисто консольный, конечно, причём синтаксис очень напоминает poetry. По функционалу это почти одно и то же, но с кучей плюшек и в несколько раз быстрее. В доке приведена вот такая диаграмма времени установки одинакового набора зависимостей:

сравнительная диаграмма времени установки зависимостей

Синтаксис действительно похож на poetry. Вот так, например, создаетс проект(сразу переходим в каталог):

uv init project
cd project

Там у нас вот такая вот структура:

project
├── .python-version
├── hello.py
├── pyproject.toml
└── README.md

Зависимости, как и у poetry, сохраняются в конфиге pyproject.toml, версия питона - в .python-version.

Создадим виртуальное окружение:

uv venv

Добавим SQLAlchemy в зависимости:

uv add sqlalchemy

Или можем добавить конкретную версию:

Теперь удалим:

uv remove sqlalchemy

Теперь сахар - менеджмент версий питона. Поставим 3.11.9 и создадим окружение с таким интерпретатором.

uv python install 3.11.9
uv venv --python 3.11.9

Версия питона сохранится в .python-version, и не надо при смене интерпретатора каждый раз указывать на это пакетному менеджеру, ведь UV и есть пакетный менеджер. Причём можно даже не устанавливать версию руками, а сразу создать окружение с нужной версией: если она не установлена, то UV сам её спуллит, то есть можно вообще об этом не думать - ну кайф же.

Как и в poetry, есть функционал по сборке и публикации пакетов на PyPI. Собрать контейнер и опубликовать пакет можно в две команды:

uv build
uv publish

Ещё можно использовать UV как супервизор, и запускать скрипты и приложения при помощи uv run

И вишенка на торте - docker образ.

FROM ghcr.io/astral-sh/uv:python3.12

WORKDIR /app

RUN uv venv

CMD ["run", "app"]

Не надо пуллить образ питона и там устанавливать UV через pip, можно сразу спуллить образ UV и кайфовать. Плюс там ещё много всяких фишек, но об этом в доке (которая, кстати, очень понятная) - те, кому эти фишки нужны в доку полезть не побоятся.

В целом, реально удобный тул и хорошая альтернатива poetry. Ни в одной IDE пока нет поддержки UV, но это вопрос времени. Круто, что столько фишек, хочется, чтобы проект развивался. Делитесь этим постом и пишите, чем пользуетесь вы.

P.S. И надо сабнуться на тгк: https://t.me/dmkjfss

Featured ones: