Наконец-то распробовал 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, который в итоге затащили вообще везде и всюду.