Пакетных менеджеров для питона как-то слишком много. У этого, конечно, есть очевидная причина - скудность функционала 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 add sqlalchemy@2.0.32
Теперь удалим:
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
Top comments (0)