Перейти к основному содержимому

Poetry и uv — управление зависимостями Python

Разработчику Инженеру

Классическая связка venv + pip + requirements.txt описана в зависимостях Python. Она работает для коротких скриптов, но в командных проектах быстро упирается в ограничения:

  • версии вроде requests>=2.31 задают диапазон, а не точный граф всех транзитивных пакетов;
  • метаданные проекта (имя, версия, точка входа) часто живут отдельно от зависимостей;
  • на разных машинах и в CI дерево пакетов может разойтись, хотя requirements.txt один и тот же.

Poetry и uv решают это через единый pyproject.toml и lock-файл — снимок всех версий, который воспроизводит окружение один в один.

ИнструментАвторОсобенность
PoetryСообщество Python PackagingЗрелый UX, poetry add, публикация на PyPI
uvAstral (создатели Ruff)Очень быстрый install/lock/sync, совместим с pip workflow

Практикум идёт по шагам — от понимания pyproject.toml до Poetry, uv, CI и типичных ошибок.

ШагТемаЗачем
1pyproject.toml и PEP 621Единый манифест проекта
2Lock-файлВоспроизводимые сборки
3Poetry — установка и командыКлассический workflow
4uv — установка и командыСкорость и современный CLI
5Миграция с requirementsПеренос учебного проекта
6CI и gitЧто коммитить
7Выбор инструментаКогда достаточно pip
МатериалЗачем
Зависимости Python — pipБазовый pip и requirements
Виртуальные окруженияЗачем изолировать .venv
Манифесты в проектеТеория lock и SemVer
Python для MLТяжёлые пакеты через uv add

Общая теория конфигураций — конфигурации и данные.

Редактор и терминал

Команды удобно выполнять во вкладке Терминал VS Code (Ctrl+`). Укажите интерпретатор из .venv проекта — иначе IDE не увидит установленные пакеты.


Шаг 1 — базовый pyproject.toml

Оба инструмента опираются на стандарт PEP 621 — секция [project] в TOML-файле.

[project]
name = "demo-app"
version = "0.1.0"
description = "Учебный проект"
requires-python = ">=3.11"
dependencies = [
"requests>=2.31.0",
]

[project.scripts]
demo = "demo_app.cli:main"

Разбор:

  • [project] — имя, версия, минимальный Python, прямые зависимости.
  • requires-python — Poetry и uv откажутся ставить пакет на слишком старый интерпретатор.
  • dependencies — то, что раньше писали в requirements.txt, но декларативно.
  • [project.scripts] — консольная команда demo после pip install / poetry install пакета в editable-режиме.

Структура каталога для библиотеки:

demo-app/
pyproject.toml
demo_app/
__init__.py
cli.py
tests/
test_cli.py
ПолеСмысл
nameИмя на PyPI (если публикуете)
versionSemVer — 1.0.0, 0.1.0
descriptionКраткое описание для PyPI
requires-pythonМинимальная версия Python
dependenciesПрямые runtime-зависимости

Шаг 2 — зачем нужен lock-файл

pyproject.toml говорит: "мне подходит requests>=2.31". При установке pip или Poetry разрешает весь графrequests тянет urllib3, certifi, charset-normalizer и т.д. Без lock разные дни установки могут дать разные минорные версии транзитивных пакетов.

Lock-файл фиксирует точные версии каждого пакета в графе:

ФайлИнструментКоммитить?
poetry.lockPoetryДа
uv.lockuvДа

Команда poetry lock или uv lock пересчитывает lock после изменения pyproject.toml. В CI используют --frozen / --no-update, чтобы не менять lock на лету.

Lock и безопасность

Lock помогает воспроизводимости и аудиту: при обновлении зависимостей diff lock-файла показывает, какие транзитивные пакеты изменились. Для prod-сервисов периодически обновляйте lock и прогоняйте тесты.


Шаг 3 — Poetry пошагово

Установка Poetry

Не ставьте Poetry в системный Python на Linux с PEP 668 — получите externally-managed-environment. Варианты:

# Официальный installer (рекомендуется)
curl -sSL https://install.python-poetry.org | python3 -

# или pipx (изолированно)
pipx install poetry

Проверка:

poetry --version

Документация: python-poetry.org.

Новый проект

poetry new demo-app
cd demo-app
poetry add httpx pydantic

Poetry создаёт:

demo-app/
pyproject.toml
poetry.lock
demo_app/
__init__.py
tests/
__init__.py
test_demo_app.py
README.md

Секция [tool.poetry] в pyproject.toml добавляется автоматически — Poetry расширяет PEP 621 своими полями (группы dev, build backend).

Основные команды

poetry install # venv + все deps из lock
poetry run python -m demo_app
poetry add pytest --group dev
poetry add "django>=5.0,<6"
poetry shell # активировать venv Poetry (устаревающий способ)
poetry env info # путь к .venv
КомандаДействие
poetry add flaskДобавить зависимость, обновить lock
poetry remove flaskУдалить из toml и lock
poetry updateОбновить все пакеты в рамках ограничений
poetry lockПересчитать lock без установки
poetry install --no-rootТолько deps, без установки самого пакета (CI)
poetry run pytestЗапуск в venv Poetry

Dev-зависимости (тесты, линтеры, mypy) — группа [tool.poetry.group.dev.dependencies] или флаг --group dev. Они не попадают в wheel при публикации на PyPI.

Пример dev-группы

poetry add --group dev pytest ruff mypy

В pyproject.toml появится:

[tool.poetry.group.dev.dependencies]
pytest = "^8.0"
ruff = "^0.8"

Работа внутри venv без poetry shell

Современный подход — явный poetry run:

poetry run python script.py
poetry run uvicorn demo_app.main:app --reload

Или активировать venv вручную — путь покажет poetry env info -p.

Миграция с requirements.txt

cd existing-project
poetry init # интерактивно или --no-interaction
poetry add $(cat requirements.txt)
poetry lock
poetry install

Проверьте poetry.lock, прогоните тесты. Удаляйте requirements.txt только когда CI переведён на poetry install. Для legacy можно оставить requirements.txt, сгенерированный из lock:

poetry export -f requirements.txt --output requirements.txt --without-hashes

Шаг 4 — uv пошагово

uv — менеджер пакетов и интерпретаторов на Rust от Astral (те же авторы, что Ruff). Команды короче, установка и sync значительно быстрее pip.

Установка uv

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# Linux/macOS
curl -LsSf https://astral.sh/uv/install.sh | sh

Проверка:

uv --version

Документация: docs.astral.sh/uv.

Новый проект

uv init demo-uv
cd demo-uv
uv add requests httpx
uv run python main.py

Создаётся pyproject.toml, uv.lock и .venv (часто в .venv/ в корне проекта).

КомандаДействие
uv add flaskДобавить зависимость и обновить lock
uv remove flaskУдалить пакет
uv syncПривести venv к lock
uv sync --frozenCI — упасть, если lock не совпадает с toml
uv lockПересчитать lock
uv run pytestЗапуск в venv проекта
uv python install 3.12Скачать интерпретатор
uv python pin 3.12Зафиксировать версию в .python-version

uv и виртуальное окружение

uv создаёт .venv автоматически при uv sync или uv run. Отдельный python -m venv обычно не нужен — см. виртуальные окружения.

uv venv # явно создать .venv
uv sync # установить deps из lock в .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows

Dev-зависимости в uv

uv add --dev pytest ruff

В pyproject.toml:

[dependency-groups]
dev = [
"pytest>=8.0",
"ruff>=0.8",
]

Установка только runtime:

uv sync --no-dev

uv pip — совместимость с pip-tools

Если команда привыкла к pip-compile:

uv pip compile pyproject.toml -o requirements.txt
uv pip sync requirements.txt

Это мост между старым и новым workflow без полной миграции.

Миграция с requirements через uv

uv init
uv add -r requirements.txt
uv lock
uv sync

Сравните время uv sync с pip install -r requirements.txt на том же наборе — разница особенно заметна в CI.


Шаг 5 — сравнение workflow

Задачаpip + requirementsPoetryuv
Зафиксировать все версииpip freeze (грубо, без разделения prod/dev)poetry.lockuv.lock
Добавить пакетРедактировать txt вручнуюpoetry adduv add
Установить depspip install -rpoetry installuv sync
CI installpip install -rpoetry install --no-interactionuv sync --frozen
СкоростьСредняяСредняяОчень высокая
Публикация на PyPImanual / hatchlingpoetry publishuv publish (развивается)
Управление Pythonpyenv / системныйpoetry env useuv python install
СитуацияРекомендация
Учебный скрипт на 1 файлvenv + pip (39)
Библиотека / приложение в командеPoetry или uv
Монорепо, нужна скорость CIuv
Уже есть Poetry в проектеОставить Poetry, пока нет причины мигрировать
Смешать Poetry и uv в одном репоИзбегать — один lock-файл на проект

Шаг 6 — что коммитить в git

ФайлКоммитить?Почему
pyproject.tomlДаИсточник правды для зависимостей
poetry.lock / uv.lockДаВоспроизводимость
.venv/НетЛокальное окружение, тяжёлый каталог
requirements.txtТолько legacy CIИначе удалить после миграции
.python-versionДа (если есть)Фиксация версии Python для команды

Шаблон .gitignore для Python — Git в разработке.

.venv/
__pycache__/
*.pyc
dist/
*.egg-info/

Шаг 7 — пример для CI (GitHub Actions)

Poetry

name: tests
on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install poetry
- run: poetry install --no-interaction --no-root
- run: poetry run pytest

Кэш Poetry ускоряет повторные прогоны:

- uses: actions/cache@v4
with:
path: ~/.cache/pypoetry
key: poetry-${{ runner.os }}-${{ hashFiles('poetry.lock') }}

uv

name: tests
on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v4
- run: uv sync --frozen
- run: uv run pytest

setup-uv сам подтянет Python по requires-python и .python-version.


Типичные ошибки

СимптомПричинаЧто сделать
externally-managed-environmentУстановка в системный Python (PEP 668)Installer Poetry, pipx или uv
Lock out of dateПравили toml без lockpoetry lock / uv lock
IDE не видит пакетыВыбран системный PythonИнтерпретатор из .venv
Конфlict Poetry + uvДва lock в одном проектеОдин инструмент на репозиторий
SolverProblemErrorНесовместимые версии depsОслабить pin или обновить пакет
Медленный CI на pipНет кэша wheeluv или cache action
ModuleNotFoundError после installЗапуск вне venvpoetry run / uv run

Практический сценарий — учебный REST-сервис

Соберите мини-проект с FastAPI через uv:

uv init notes-api
cd notes-api
uv add fastapi uvicorn
uv add --dev pytest httpx

pyproject.toml после uv add:

[project]
name = "notes-api"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
"fastapi>=0.115",
"uvicorn[standard]>=0.32",
]

Запуск:

uv run uvicorn main:app --reload

Тест с httpx:

uv run pytest

Тот же сценарий на Poetry — poetry add fastapi uvicorn и poetry run uvicorn .... Подробнее про API — FastAPI — первая программа.


Как превратить учебный проект в библиотеку

План эволюции

  1. Один pyproject.toml с [project] и lock.
  2. Структура пакета src/ или flat layout с тестами.
  3. Dev-группа: pytest, ruff, mypy.
  4. CI на uv sync --frozen или poetry install.
  5. Версионирование SemVer и changelog при публикации.

Базовые поля для PyPI

[project]
name = "my-lib"
version = "0.2.0"
description = "Краткое описание"
readme = "README.md"
license = { text = "MIT" }
authors = [{ name = "Author", email = "a@example.com" }]

Публикация Poetry:

poetry build
poetry publish

Подробный разбор pyproject.toml для Poetry

После poetry init или poetry new в файле появляется секция [tool.poetry]:

[tool.poetry]
name = "demo-app"
version = "0.1.0"
description = ""
authors = ["You <you@example.com>"]
readme = "README.md"
packages = [{ include = "demo_app" }]

[tool.poetry.dependencies]
python = "^3.11"
httpx = ">=0.27,<0.28"

[tool.poetry.group.dev.dependencies]
pytest = "^8.0"
ruff = "^0.8"
ПолеСмысл
^3.11Совместимо с >=3.11,<4.0 (caret)
>=0.27,<0.28Явный диапазон minor
packagesКакие каталоги войдут в wheel
group.devНе ставится при --only main

Команда poetry add "django>=5.0,<6" переписывает toml и lock атомарно — не редактируйте lock вручную.

Editable install

При разработке библиотеки:

poetry install

Poetry ставит пакет в venv в режиме editable — изменения в demo_app/ видны без переустановки.

Экспорт для legacy Docker

poetry export -f requirements.txt --without-hashes -o requirements.txt
poetry export -f requirements.txt --without-hashes --only dev -o requirements-dev.txt

Подробный разбор deps.edn для uv

Минимальный pyproject.toml после uv init:

[project]
name = "demo-uv"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = []

Alias и dev-зависимости в uv:

[dependency-groups]
dev = [
"pytest>=8.0",
"ruff>=0.8",
]

[tool.uv.sources]
my-lib = { path = "../my-lib", editable = true }
Команда uvКогда
uv lock --upgrade-package requestsОбновить один пакет
uv treeПоказать граф зависимостей
uv pip listСписок в venv
uv cache cleanОчистить кэш wheel

Фиксация версии Python

uv python pin 3.12

Создаёт .python-version — CI и collegues получают ту же версию через uv python install.


Пошаговая миграция учебного проекта

Исходник — каталог с requirements.txt:

legacy-bot/
requirements.txt
bot.py
tests/test_bot.py

Шаг A. Создайте venv backup и snapshot:

pip freeze > freeze-before.txt

Шаг B. Инициализация uv:

cd legacy-bot
uv init --name legacy-bot
uv add -r requirements.txt
uv add --dev pytest
uv lock

Шаг C. Проверка:

uv run pytest
uv run python bot.py --help

Шаг D. Обновите CI и README; удалите requirements.txt после зелёного pipeline.

Шаг E. Добавьте в .gitignore только .venv/, commit uv.lock.

ЭтапКритерий готовности
Lock созданuv.lock в git
Тестыuv run pytest green
CIuv sync --frozen
ДокументацияREADME с uv sync

SemVer и ограничения версий

ЗаписьИнтерпретация (Poetry caret)
^1.2.3>=1.2.3,<2.0.0
^0.2.3>=0.2.3,<0.3.0
~1.2.3>=1.2.3,<1.3.0
*Любая (опасно в prod)

Для приложений (не библиотек) lock важнее широких диапазонов в toml — команда ставит из lock.


Docker с uv

FROM python:3.12-slim
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
COPY . .
CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0"]

Слои кэшируются: пока lock не менялся, uv sync берёт wheel из cache.


Docker с Poetry

FROM python:3.12-slim
RUN pip install poetry
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false \
&& poetry install --no-interaction --no-root --only main
COPY . .
CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0"]

Изоляция инструментов — pipx

Poetry и uv не ставьте в system site-packages на Ubuntu 24.04+:

pipx install poetry
pipx install uv
pipx ensurepath

22 — виртуальные окружения объясняет, почему глобальный pip для библиотек — плохая идея.


Расширенный FAQ

ВопросОтвет
Можно ли коммитить и poetry.lock и uv.lock?Нет, один инструмент
Как обновить всё?poetry update / uv lock --upgrade
IDE PyCharmSettings → Python Interpreter → path to .venv
VS CodeCommand Palette → Python: Select Interpreter
Pre-commituv run ruff check в hook
Private PyPI[tool.poetry.source] / [[tool.uv.index]]

Навигация по блоку Python


Шаг 8 — poetry check и аудит

poetry check
poetry show --tree
poetry show --outdated
КомандаЗачем
checkВалидность pyproject
show --treeДерево зависимостей
show --outdatedЧто можно обновить

uv аналоги:

uv tree
uv pip list --outdated

Шаг 9 — группы зависимостей в Poetry

poetry add --group test pytest pytest-cov
poetry add --group lint ruff mypy
poetry install --with test,lint

Optional groups в [tool.poetry.group.test.optional] — ставятся по запросу.


Шаг 10 — scripts в pyproject

PEP 621 entry points:

[project.scripts]
demo-cli = "demo_app.cli:main"

[project.entry-points."demo.plugins"]
myplugin = "demo_app.plugins:register"

Запуск после install:

uv run demo-cli --help
poetry run demo-cli --help

Шаг 11 — editable path dependency

[tool.uv.sources]
local-lib = { path = "../local-lib", editable = true }

[project]
dependencies = ["local-lib"]

Monorepo: несколько пакетов в одном git с path deps.


Шаг 12 — pre-commit hook

.pre-commit-config.yaml:

repos:
- repo: local
hooks:
- id: ruff
name: ruff
entry: uv run ruff check
language: system
pass_filenames: false

Сравнение lock-форматов

Аспектpoetry.lockuv.lock
ФорматTOML proprietaryTOML uv schema
Merge conflictsчастые в busy teamsаналогично
Cross-toolexport onlyimport poetry possible

Выберите один инструмент — merge lock вручную болезненен.


Учебное упражнение — два окружения

  1. Склонировать один repo в poetry-demo и uv-demo.
  2. В poetry-demo: poetry install, замерить время cold install.
  3. В uv-demo: uv sync, сравнить.
  4. Изменить одну dev-зависимость — сравнить lock diff.
  5. Написать один GitHub Actions job для каждого.

Связанные материалы

ТемаМатериал
pip и requirements39 — зависимости Python
venv22 — виртуальные окружения
pytest37 — тестирование Python
ML-стек392 — Python для ML
CPython и PyPI11 — архитектура CPython
Практика

Перенесите учебный проект с requirements.txt на uv init && uv add -r requirements.txt и сравните время uv sync с pip install -r. Зафиксируйте lock в git и прогоните тесты в CI с --frozen.

Production

Для боевых сервисов pin-ьте образ Docker на конкретную версию Python, копируйте lock в образ и используйте uv sync --frozen --no-dev или poetry install --only main. Секреты — только через переменные окружения, не в pyproject.toml.


Второй проход — workspaces и аудит (черновик)

uv workspace (монорепо)

[tool.uv.workspace]
members = ["packages/api", "packages/lib"]

uv sync в корне устанавливает весь граф; path-зависимости между членами workspace — без публикации на PyPI.

Аудит CVE

pip install pip-audit
uv export --frozen | pip-audit -r /dev/stdin

В CI — шаг после uv sync --frozen. Diff lock при обновлении показывает транзитивные уязвимости.

Миграция Poetry → uv (краткий чек-лист)

  1. Ветка, backup poetry.lock.
  2. uv init, перенос [project] и uv add по poetry show.
  3. Тесты и CI на uv sync --frozen.
  4. Удалить poetry.lock после зелёного pipeline.

Один lock на репозиторий — не смешивать инструменты.



FAQ — полный список

1. Poetry или uv?

Poetry — зрелый UX. uv — скорость CI и install.

2. Можно ли два lock в одном проекте?

Нет — один инструмент на репозиторий.

3. Что коммитить?

pyproject.toml + lock. Не .venv/.

4. externally-managed-environment?

Installer Poetry, pipx или uv — не системный pip.

5. Как добавить dev-зависимость?

Poetry: --group dev. uv: --dev.

6. CI frozen install?

uv sync --frozen или poetry install --no-interaction.

7. Миграция с requirements?

uv add -r requirements.txt или poetry add $(cat requirements.txt).

8. Публикация на PyPI?

poetry publish или uv publish.

9. SemVer в pyproject?

Манифесты.

10. venv вручную нужен?

uv/poetry создают .venv автоматически — 22.

11. Как pin Python?

uv python pin 3.12 или .python-version.

12. Docker prod?

uv sync --frozen --no-dev в образе.

13. SolverProblemError?

Ослабить pin или обновить конфликтующий пакет.

14. IDE не видит пакеты?

Интерпретатор из .venv.

15. export requirements?

poetry export -f requirements.txt.

16. FastAPI через uv?

uv add fastapi uvicorn — 3432.

17. ML-стек тяжёлый?

См. 392 — torch через uv add.

Упражнения — расширенный набор

  1. Перенести requirements.txt на uv init && uv add -r.
  2. Добавить pytest в dev-группу и CI с --frozen.
  3. Сравнить время uv sync и pip install.
  4. Создать notes-api на FastAPI через uv.
  5. Настроить .python-version и requires-python.
  6. Dockerfile с uv sync --frozen --no-dev.
  7. poetry export для legacy CI.
  8. Добавить ruff и mypy в dev.
  9. Lock diff при обновлении одного пакета.
  10. Документировать команды в README.

Практикум — дополнительный блок 1 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 1
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 1

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 1"

Практикум — дополнительный блок 2 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 2
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 2

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 2"

Практикум — дополнительный блок 3 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 3
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 3

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 3"

Практикум — дополнительный блок 4 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 4
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 4

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 4"

Практикум — дополнительный блок 5 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 5
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 5

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 5"

Практикум — дополнительный блок 6 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 6
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 6

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 6"

Практикум — дополнительный блок 7 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 7
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 7

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 7"

Практикум — дополнительный блок 8 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 8
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 8

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 8"

Практикум — дополнительный блок 9 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 9
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 9

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 9"

Практикум — дополнительный блок 10 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 10
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 10

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 10"

Практикум — дополнительный блок 11 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 11
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 11

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 11"

Практикум — дополнительный блок 12 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 12
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 12

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 12"

Практикум — дополнительный блок 13 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 13
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 13

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 13"

Практикум — дополнительный блок 14 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 14
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 14

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 14"

Практикум — дополнительный блок 15 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 15
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 15

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 15"

Практикум — дополнительный блок 16 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 16
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 16

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 16"

Практикум — дополнительный блок 17 (391)

ШагДействиеПроверка
1Повторить базовый сценарий из начала статьиКоманда завершается без ошибок
2Запустить тесты или curl smokeОжидаемый HTTP-код или green test
3Зафиксировать результат в READMEШаги воспроизводимы на другой машине
Подсказка 17
Сверьтесь с материалами энциклопедии по ссылкам /encyclopedia/ в начале статьи. При ошибке сначала читайте traceback или лог до своей строки — см. отладку.

Troubleshooting — мини-чеклист 17

#ВопросЕсли да
1Версия runtime совпадает с таблицей требований?Обновить или зафиксировать в документации
2Зависимости установлены из lock-файла?Переустановить без изменения lock
3Порт не занят другим процессом?Сменить порт или завершить процесс
4Переменные окружения заданы?Проверить .env и секреты на хостинге
5Тесты проходят локально?Только после green — деплой
# Smoke — адаптируйте под свой стек (391)
echo "Smoke block 17"
Содержание