~/guides/uv-012-default-src-layout-migration

TOML

uv 0.12: uv init теперь создаёт src/-layout по умолчанию — что изменилось

Смена дефолтной структуры проекта в менеджере пакетов uv и практический подход к миграции существующих проектов.

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 использует каждый из них.