28 июля 2026 года вышел свежий релиз uv с множеством жёстких правок. Главное — uv init теперь по умолчанию создаёт упакованные проекты с собственной системой сборки uv_build. Раньше получался просто main.py без build system, теперь — полноценная структура с src/example, [project.scripts] и возможностью запуска через uv run example. Для обратной совместимости оставили uv init --no-package.
uv стал агрессивнее отбрасывать устаревшие и небезопасные форматы. Source distribution обязаны использовать .tar.gz — .tar.bz2 и .tar.xz больше не принимаются. Внутри wheel запрещены записи со сжатием bzip2, LZMA и XZ; разрешены только stored, DEFLATE и zstd. Так срезали зоопарк компрессионных зависимостей и уменьшили поверхность атаки на этапе распаковки пакетов.
Вдогонку прикрутили защиту от wheel, которые могли подменить интерпретатор Python. Раньше блокировался только entry point с именем python, теперь — любые варианты вроде Python, python.py, Python.exe и файлы, попадающие через .data/scripts или .data/data/bin/python. На регистронезависимых файловых системах это спасает виртуальное окружение от случайной перезаписи.
Поменялась логика работы с пре-релизами. Режим по умолчанию стал if-necessary вместо if-necessary-or-explicit. uv сначала ищет стабильные версии и сам подхватывает пре-релизы из транзитивных зависимостей, если стабильных не нашлось. Раньше приходилось явно разрешать пре-релизы во всём графе или прописывать прямую зависимость. Поведение управляется флагами --prerelease disallow/allow/explicit.
В теме хешей тоже навели порядок. Директива --require-hashes в requirements.txt теперь реально включает режим строгой проверки, а не просто предупреждает. В хеш-чекинге запретили обходиться одним MD5 — требуется хотя бы один стойкий дайджест вроде SHA-256.
uv стал строже к pylock.toml: массив packages обязателен, имена файлов с двойными точками отклоняются, а указанный размер артефакта проверяется до байта, не игнорируется при совпадении хеша.
Переменные SSL_CERT_FILE и SSL_CERT_DIR теперь всегда переопределяют системные корневые сертификаты, даже если путь невалиден или пуст — HTTPS-запросы упадут, пока переменную не поправишь. У uv pip появился флаг --cert для локального PEM-бандла.
uv run script.py теперь ищет проект в директории скрипта, а не в текущей папке. Сломанные .venv-симлинки больше не игнорируются, uv сразу падает с ошибкой.
uv venv --clear отказывается удалять директорию, если она не виртуальное окружение, без явного --force. --project при uv init теперь ошибка, а сам --project требует существующей папки или pyproject.toml.
uv publish пропускает дистрибутивы с ненормализованными именами (например, 1.01.0 вместо 1.1.0). Conda-окружения с именами base и root распознаются по путям. uv python install --reinstall переустанавливает уже присутствующие патч-версии, а не тянет последний патч-релиз: для апгрейда отдельный флаг --upgrade. --upgrade-group валидирует имя существующей группы зависимостей.
Относительные пути --index и --find-links теперь разрешаются от директории, заданной через --directory. uv add сохраняет абсолютные пути, если они были переданы. Старые PyPy-сборки в .tar.bz2 удалены из uv python install, а uv pip compile --no-annotate больше не добавляет комментарий об исключённых пакетах. Артефакты релиза подписаны GitHub Artifact Attestations, проверить их можно через GitHub CLI.