uv, менеджер пакетов Python от Astral, к середине 2026 года фактически заменил pip, poetry и pyenv для новых проектов — более сорока пяти тысяч звёзд на GitHub и поддержка OpenAI говорят сами за себя. В версии 0.12, вышедшей в июле 2026 года, дефолтное поведение команды uv init поменялось: вместо плоского main.py в корне теперь создаётся полноценный packaged src/-layout с точкой входа через консольный скрипт.
Как выглядели оба варианта
Старый дефолт (до 0.12):
my-project/
main.py
pyproject.toml
Новый дефолт (0.12+):
my-project/
src/
my_project/
__init__.py
pyproject.toml (с project.scripts)
Старое поведение осталось доступно через явный флаг --no-package — оно никуда не делось, просто больше не выбирается по умолчанию без явного указания.
Почему это важно для скриптов и CI
Любой скрипт или CI-шаг, который предполагает наличие main.py в корне нового проекта, начатого командой uv init без флагов, после обновления до 0.12 столкнётся с иной структурой. Это не breaking change в смысле поломки существующих проектов — они продолжают работать в своей текущей структуре — но новые проекты, созданные без явного флага, будут выглядеть иначе, чем ожидает старая документация или шаблоны.
Практический подход к разнородному монорепозиторию
| Ситуация | Действие |
|---|---|
| Новый проект, только начинается | Использовать новый дефолт без флагов, если не нужна плоская структура |
| Существующий проект с main.py | Не обязательно мигрировать, старая структура продолжает работать |
| Нужна именно плоская структура для нового проекта | Явно указать флаг –no-package при инициализации |
Как быстро понять, с каким layout вы имеете дело
pyproject.toml uv Project Layout Analyzer определяет тип проекта по структуре pyproject.toml — полезно при аудите монорепозитория с несколькими Python-проектами разного возраста.
Итоговый чеклист
Смена дефолта в uv 0.12 касается новых проектов, инициализируемых без явных флагов — существующие проекты не затронуты автоматически.
Флаг –no-package сохраняет старое поведение плоской структуры для тех, кому оно нужно по конкретным причинам.
При аудите монорепозитория с разновозрастными Python-проектами стоит заранее понимать, какой layout использует каждый из них.