Наконец-то распробовал uv. Тот самый "убийца pip" на Расте от команды Astral. Удобненько, ооочень шустро работает, с зависимостями не косячит.

Всё наше добро вписываем в pyproject.toml, делаем uv sync для установки, 5 секунд ждём и готово! Естественно, появится lock-файл, в котором будут зафиксированы все зависимости.

Очень понравилось, как устроены "группы зависимостей". В одном файле prod/dev/test зависимости, только разнесённые по группам. На фоне пипа с миллионом файлов requirements.txt/requirements.test.txt и т.д - очень вкусно.

Но и это не всё. Хотя избавиться от тормознутого pip'а это уже удовольствие. Есть еще кое-что: он умеет скачивать и устанавливать нужные версии Python. И переключаться между ними можно одной простой командой.

Шпаргалка по командам

  • uv init — инициализировать новый проект с pyproject.toml
  • uv add — добавить пакет в зависимости и синхронизировать окружение
  • uv remove — удалить пакет из проекта
  • uv sync — синхронизировать venv с текущим lock-файлом
  • uv sync --all-groups — синхронизировать все группы зависимостей
  • uv sync --only-group dev — синхронизировать только зависимости для dev-окружения
  • uv sync --no-dev — синхронизировать всё, кроме dev-окружения
  • uv lock — обновить только uv.lock без установки пакетов
  • uv run — запустить скрипт внутри изолированного окружения
  • uv python install 3.13 — скачать и установить конкретную версию Python в систему
  • uv python list — посмотреть список всех доступных и установленных версий Python

Пример pyproject.toml

toml version = "0.1.0" dependencies = [ "fastapi == 0.115.0", "sqlalchemy >= 2.0.25", "uvicorn[standard] >= 0.27.0", ]

[dependency-groups] dev = [ "ruff ~= 0.2.0", "pytest >= 8.0.0, < 9.0.0", ]

Еще из плюсов:

  • Нормальный, человеческий (наконец-то!) мать его кэш! Один раз скачал библиотеку и всё.
  • Читаемый лок-файл uv.lock. Приемлемо выглядит в диффах.

Хочется верить, что инструмент повторит судьбу ruff, который в итоге затащили вообще везде и всюду.