uv и uv.lock в Python

Введение

В репозитории изменился только один файл - uv.lock: около 119 добавленных строк и ни одной удалённой. Это догоняющее обновление lock-файла: манифест проекта уже требовал пакет для браузерных тестов (playwright >= 1.40), а lock-файл до этого изменения его ещё не фиксировал. Ниже разберём, что именно добавилось и почему.

Что такое uv.lock

uv.lock - это сгенерированный файл точных версий зависимостей. Манифест проекта задаёт широкие ограничения вида playwright >= 1.40, а lock-файл фиксирует конкретные версии, хеши и адреса колёс для всех платформ. Благодаря этому установка на другой машине даёт тот же набор пакетов, что и у автора изменения. Правило простое: манифест описывает что нужно, lock-файл - что именно установлено.

Что изменилось

Изменение полностью аддитивное, три части:

1. В секции зависимостей проекта появилась запись playwright, а в метаданных - ограничение playwright >= 1.40.

2. Добавлены три новые секции пакетов: playwright 1.63.0, greenlet 3.5.6 и pyee 13.0.1.

3. Для каждого пакета зафиксированы источник (реестр пакетов), точная версия, хеши и список колёс под разные ОС и архитектуры. Удалений и смен версий существующих пакетов нет.

Новые пакеты

playwright 1.63.0 - автоматизация браузера (используется тестами интерфейса со словарными страницами). В lock-файле у него две зависимости: greenlet и pyee.

greenlet 3.5.6 - примитив лёгких корутин, который playwright использует внутри себя. Это самый объёмный кусок изменения: у пакета много колёс под разные версии Python, ОС и архитектуры, поэтому он занимает большую часть добавленных строк.

pyee 13.0.1 - реализация событийного эмиттера. Его единственная зависимость - typing-extensions, который уже был в lock-файле, поэтому отдельно ничего для него не добавилось.

Как повторить проверку

Посмотреть сводку изменения:

git diff --stat

Посмотреть только имена новых пакетов:

git diff -- container/uv.lock | grep "^+name"

Перегенерировать lock-файл после правки манифеста:

uv lock

Проверить, что окружение собирается:

uv sync

Все пути выше условные: репозиторий может лежать в любом каталоге, например

~/projects/demo

Почему это безопасно

Изменение только добавляет пины, ничего не удаляет и не меняет версии уже используемых пакетов (pytest, requests и остальные остались как были). Значит, существующие тесты и проверки не могут сломаться из-за смены версий: для них набор зависимостей тот же. Единственный новый эффект - теперь воспроизводимо устанавливается инструмент браузерных тестов вместе со своими транзитивными зависимостями.

Автор статьи: Андрей Олегович