~/guides/uv-required-environments-platform-limits

TOML

required-environments в pyproject.toml: как ограничить платформы для пакетов без исходников

Разбор нового поля uv для проектов с зависимостями вроде PyTorch, которые публикуют только предсобранные wheel-дистрибутивы.

Некоторые пакеты Python экосистемы публикуют только предсобранные wheel-дистрибутивы без исходного кода — классический пример PyTorch. Такой пакет физически можно установить только на платформах, для которых существует готовый бинарный дистрибутив, а не на любой платформе через сборку из исходников. Поле required-environments в секции [tool.uv] явно формализует это ограничение прямо в конфиге проекта.

Синтаксис поля

[tool.uv]
required-environments = [
    "sys_platform == 'darwin' and platform_machine == 'x86_64'",
]

Условие использует синтаксис PEP 508 environment marker — тот же формат, что применяется в extras зависимостей Python пакетов, с переменными вроде sys_platform, platform_machine, python_version.

Что происходит без этого поля

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

Второе связанное поле — no-build-isolation-package

[tool.uv]
no-build-isolation-package = ["cchardet"]

Решает другую, смежную задачу: отключает изоляцию сборки для конкретных пакетов, чьи build-зависимости должны быть установлены заранее как обычные зависимости проекта, а не в изолированной среде сборки — актуально для пакетов вроде cchardet с нетривиальными требованиями к окружению сборки.

Риск синтаксической ошибки

Опечатка в marker-выражении не всегда выдаёт понятную ошибку сразу — она может тихо привести либо к невозможности установки на платформе, которая должна была поддерживаться, либо к неверной интерпретации условия резолвером.

Как проверить синтаксис перед реальной сборкой

uv Environment Markers Validator проверяет корректность marker-выражений сразу в нескольких pyproject.toml, до того как ошибка проявится в реальной попытке установки.

Итоговый чеклист

required-environments актуален именно для зависимостей без исходного дистрибутива вроде PyTorch, ограничивающих проект набором платформ с готовыми wheel.

Синтаксис условия — стандартный PEP 508 environment marker, тот же формат, что и в extras зависимостей.

no-build-isolation-package решает смежную, но отдельную задачу — отключение изоляции сборки для конкретных пакетов, а не ограничение платформ.