TGViewer
этогик // DevOps, Infrastructure, Productivity этогик // DevOps, Infrastructure, Productivity @etogeek · 4.38K subscribers
Post #349 3.89K
Небольшой отчет о том, чем занимался на работе в последнее время.

У нас есть довольно большой проект на Python и вот мы решили мигрировать его со стандартного pip для управления зависимостями на современный и популярный uv.

Как было раньше: два файла - requirements.txt с основным набором зависимостей и requirements-dev.txt - в нем добавлены некоторые дополнительные зависимости для локальной разработки и в тестах. Чтобы добавить их в pyproject.toml можно использовать uv add -r requirements.txt

dev-файлик перезжает в uv в отдельную "группу" зависимостей. Зависимости такой группы можно поставить вместе с основными через флаг --group name.

Сам uv генерит uv.lock файл, в котором зафиксирован слепок этих зависимостей, подзависимостей, транзитивных и так далее. Похоже на package-lock.json в Node.

Основной воркфлоу теперь немного меняется:
- uv sync создает виртуальное окружение (как раньше в .venv) и ставит в него все зависимости
- uv run <command> запускает команду в виртуальном окружении, например uv run python main.py
- учитывая наличие .venv после uv sync, можно сделать source .venv/bin/activate и работать как раньше

Dockerfile тоже нужно переделать. Пример беру в официальном example-репозитории.

Сам бинарник uv беру из образа через COPY, чтобы не конфликтовать по версии Python между pyproject.toml (там например зафиксирована 3.X.13) и официальным образом uv-python (они фиксируют только 3.X без патч-версии).

Из интересных оптимизаций билда - использование mount-ов для RUN директив. Они позволяют использовать кэш на диске сборочного инстанса в случае инвалидации слоя - например поменялся слой с зависимостями, но мы все равно используем кэш, чтобы все не перекачивать.

В gitlab-ci настраиваю использование кэша:
  cache:
key:
files:
- uv.lock
paths:
- .cache/uv


Если используете self-hosted докер-раннеры, то в настройках надо добавить:
[[runners]]
[runners.docker]
disable_cache = false
volumes = ["/var/path/to/cache:/cache"]


А вот что не получилось пока что сделать: указать кастомный индекс (nexus-proxy) для Python-зависимостей только на сборках/тестах. Чтобы при локальной установке качать зависимости с PyPi, а на сборке - с Nexus. При изменении index-url uv меняет uv.lock файл, чего я делать не хочу. Но, наверное, это логично.
  • 🔥 13
  • 👍 7
  • ❤ 1
  • 😢 1
More from @etogeek
  1. Sep 4, 2026Баланс в EdTech Подписан на канал Mischa van den Burg и там недавно вышло видео, где автор…
  2. Aug 31, 2026Чтобы немного подвести итог серии постов про бекапы (раз и два), расскажу как я ими управл…
  3. Aug 25, 2026Мониторинг бекапов В прошлый раз я говорил про PITR-бекапы для PostgreSQL, теперь хочу нем…
  4. Aug 21, 2026Про бекапы. Хочу немного поделиться своим опытом в нескольких постах. Это больше информаци…
  5. Aug 13, 2026Когда я преподавал в Практикуме (был такой период, да. еще и видео снимал), студенты часто…
  6. Jun 25, 2026Некоторое время назад столкнулся с тем, что какой-то сервис отправил мне огромное количест…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →