2025, Nov 01 23:16
Streamlink в uv: как передать STREAMLINK_USE_PYCOUNTRY при сборке
Как собрать Streamlink из исходников в uv и передать STREAMLINK_USE_PYCOUNTRY через extra-build-variables в pyproject.toml, чтобы исключить GPL-зависимости.
Сборка и упаковка Streamlink в корпоративной среде обычно сопровождается строгими требованиями к соответствию. Сразу проявляются два ограничения: пакет нужно собирать из исходников и исключать зависимости под лицензией GPL. В случае с pip это просто: совмещаем сборку из исходного кода с переменной окружения STREAMLINK_USE_PYCOUNTRY=1. Трудности начинаются при переходе на uv: сборка выполняется в изолированном окружении и молча игнорирует переменные, переданные из оболочки, во время операций add или pip.
Воспроизведение проблемы
В конфигурации на pip следующая команда устанавливает Streamlink из исходников и переводит выбор зависимостей с GPL-компонентов на альтернативу:
STREAMLINK_USE_PYCOUNTRY=1 pip install streamlink==1.3.1 --no-binary streamlink
Попытка выполнить эквивалентное действие в uv, передав переменную inline, не срабатывает. Команды запускаются, но сборка выбирает iso-639 и iso3166 вместо pycountry — а это уже нельзя поставлять по текущей политике.
STREAMLINK_USE_PYCOUNTRY=1 uv add --group streamlink streamlink==1.3.1 --no-binary-package streamlink
STREAMLINK_USE_PYCOUNTRY=1 uv pip install streamlink==1.3.1 --no-binary streamlink
Флаг сборки из исходников работает корректно, но переменная окружения игнорируется при добавлении и установке пакета через uv.
Что на самом деле происходит
Скрипт сборки Streamlink считывает STREAMLINK_USE_PYCOUNTRY на этапе build, поэтому переменная должна быть видна внутри окружения сборки. Да, uv поддерживает управление окружением для выполнения через uv run и env-файл, но этот механизм явно предназначен именно для запуска команд. Как задокументировано, uv pip не читает переменные окружения, относящиеся к традиционной поверхности конфигурации pip. Что ещё важнее здесь — нужно передать переменную в процесс сборки самого пакета, а не в pip. uv разделяет эти задачи и собирает пакеты в изолированном окружении, поэтому inline-экспорт из вашей оболочки не попадает в контекст сборки.
Решение в uv
uv предоставляет специальный механизм для внедрения переменных окружения на этапе сборки. Определение extra-build-variables в pyproject.toml гарантирует, что переменная будет доступна внутри изолированного окружения при компиляции Streamlink из исходников.
Это гарантирует, что переменная окружения будет передана в изолированное окружение сборки, которое использует uv для сборки Streamlink.
[tool.uv]
extra-build-variables = { streamlink = { STREAMLINK_USE_PYCOUNTRY = "1" } }
С такой конфигурацией продолжайте использовать флаг сборки только из исходников, как и раньше. Параметр no-binary уже корректно работает в uv, так что запускайте команду add или pip — сборка увидит STREAMLINK_USE_PYCOUNTRY внутри изолированного окружения.
Почему это важно
Корпоративные процессы упаковки зависят от предсказуемых и соответствующих требованиям сборок. Если скрипт ожидает переключатель вроде STREAMLINK_USE_PYCOUNTRY для выбора графа зависимостей, непереданная вовремя переменная может незаметно привести к появлению запрещённых лицензий. Механизм внедрения переменных на этапе сборки в uv делает процесс воспроизводимым, проверяемым и согласованным с политикой — без разовых манипуляций с окружением.
Итоги и практические рекомендации
Если Streamlink нужно собирать из исходников и уходить от зависимостей под GPL, настройте uv на внедрение STREAMLINK_USE_PYCOUNTRY во время сборки. Поместите переменную в секцию [tool.uv].extra-build-variables в pyproject.toml и продолжайте использовать флаг установки только из исходников. Помните, что UV_ENV_FILE и подобные механизмы относятся к uv run, а не к установке пакетов, и что uv pip намеренно не использует общую конфигурацию окружения для pip. Хранение переменной в extra-build-variables делает поведение явным и стабильным в разных окружениях.