TOML

pyproject.toml uv Project Layout Analyzer

Определить тип проекта uv (packaged src/, flat, lib, bare) по структуре pyproject.toml после смены дефолта в uv 0.12.

Как это работает

В uv 0.12, вышедшем в июле 2026 года, команда uv init поменяла поведение по умолчанию: вместо плоского main.py в корне теперь создаётся полноценный packaged src/-layout с точкой входа через консольный скрипт. Старое поведение осталось доступно только через явный флаг --no-package. Для проектов, начатых до этого релиза, и для скриптов, которые парсят структуру pyproject.toml программно, эта смена дефолта означает, что старые предположения о расположении кода могут больше не работать. pyproject.toml uv Project Layout Analyzer online определяет, к какому из типов проекта uv относится ваш pyproject.toml.

Инструмент проверяет характерные структурные признаки каждого типа: наличие build-backend uv_build и точки входа project.scripts указывает на packaged src/-layout, отсутствие build-system при наличии обычных project-полей — на минимальный bare-вариант, а определённые комбинации полей — на library-проект, собираемый через --lib.

Полезно применять при аудите монорепозитория с несколькими Python-проектами, начатыми в разное время и потому имеющими разную структуру, при онбординге в проект, где неочевидно, как именно он был инициализирован, или просто чтобы понять, стоит ли мигрировать старый плоский проект на новый packaged layout, задуманный как более предсказуемый дефолт.

Частые вопросы

Обязательно ли мигрировать старые проекты на новый packaged layout после uv 0.12?

Нет, существующие проекты продолжают работать в своей текущей структуре, смена дефолта касается именно новых проектов, создаваемых командой uv init без явных флагов, начиная с этой версии.

Как отличить packaged layout от library-проекта по структуре pyproject.toml?

Оба используют src/ директорию, но library-проект обычно не содержит точку входа через project.scripts консольного скрипта, в то время как packaged-приложение именно её и определяет для запуска через установленную команду.

Что означает --bare вариант инициализации?

Минимальный pyproject.toml только с базовыми метаданными проекта, без src/ директории, без README, без .python-version — используется при добавлении uv к уже существующей структуре проекта с собственной организацией файлов.

Можно ли определить точную версию uv, которой был инициализирован проект, только по pyproject.toml?

Не всегда напрямую, но структурные признаки (наличие build-backend uv_build против более старого hatchling) дают достаточно уверенную оценку, была ли смена дефолта уже применена при инициализации конкретного проекта.