Релиз на PyPI: Готовый к производству гайд django-nova

Убедись, что рабочая директория чиста, версия синхронизирована.

# 1. Убедимся, что все тесты проходят
pytest tests/ -v

# 2. Проверим чистоту по Ruff и Pyright
ruff check src/
pyright src/

Проверь, что версия совместима

В :pyproject.toml version = "0.1.0"
В :src/nova/__init__.py__version__ = "0.1.0"

Установка инструментов, сборка
горячий порт (открытый порт)buildtwine(для безопасной загрузки с проверкой).

uv pip install --upgrade build twine

Сборка пакета
Команда изолированно собирает пакет. Она не использует свое виртуальное окружение, а временно создает чистоту,
чтобы в пакете не появлялись левые поля в зависимости от этого.python -m build

python -m build

Что произойдет: В корне проекта создается папка. Внутри будет два файла:dist/

django_nova-0.1.0-py3-none-any.whl (Колесо — быстрая установка)
django-nova-0.1.0.tar.gz(Источник распространения — для компиляции из исходников)

Проверка пакета (критически важный шаг)
Прежде чем куда-то грузить, проверяем, что метаданные корректны.

twine check dist/*

Ожидаемый вывод: Checking dist/django_nova-0.1.0-py3-none-any.whl: PASSED

Секретный контроль (Старший уровень): Проверь,

python -m zipfile -l dist/django_nova-0.1.0-py3-none-any.whl | grep -E "tests|conftest"

Если вывести пустой — всё чисто. Наш макет сработал правильно.srcpyproject.toml

 Тестовый релиз (TestPyPI)
Никогда не выпускайте в продажу PyPI без проверок на TestPyPI. Это спасет тебя от стыда, если ты забудешь указать илиlicenserequires-python.

Зарегистрируйся на https://test.pypi.org/account/register/(можно просто через GitHub).

Вы
twine upload --repository testpypi dist/*

Проверьте, как это выглядит: Перейди по ссылке — ты должен увидеть красивую страницу с твоим README
и списком зависимостей.https://test.pypi.org/project/django-nova/

Попробуйте установить страну

uv pip install --index-url https://test.pypi.org/simple/ django-nova

 Релиз в Production PyPI
Если TestPyPI всё прошло гладко, грузим

Зарегистрируйся на https://pypi.org/account/register/(если ещё нет аккаунта).
Загрузи пакет:
twine upload dist/*

Важно: Еслиtwineзапрашивает логин/пароль, НЕ ввод пароля от PyPI (они отключили авторизацию по паролю). Нажми Enter,
и он спросит API Token . Создай его здесь: . Скопируйте токен и вставьте в терминал
(при вводе символов, не указанных в таблице, — это нормально).https://pypi.org/manage/account/token/

Тегирование Git (связка Git и PyPI)

Теперь нужно навсегда связать этот код с маркой в ​​ Git.0.1.0

git add .
git commit -m "Release v0.1.0: Core typed ORM, Pydantic bridge, smart cache"

# Создаем аннотированный тег (стандарт для релизов)
git tag -a v0.1.0 -m "v0.1.0 - Initial public release"

# Пушим код и теги
git push origin main
git push origin v0.1.0

 Автоматизация (GitHub Actions)
Как старший, ты не должен делать руки после каждого патча. В 2025 годуtwine uploadДоверенное издательство (OIDC).
Ты даешь решения PyPI о принятии решений на рассмотрение

найденный файл :.github/workflows/publish.yml

name: Publish to PyPI

on:
  release:
    types: [published] # Срабатывает только когда создаешь GitHub Release

permissions:
  id-token: write  # Обязательно для Trusted Publishing

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: pypi # Создай environment "pypi" в настройках репо с веткой main
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install build tools
        run: python -m pip install build

      - name: Build package
        run: python -m build

      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1


Как это настроить на PyPI:

Зайди в настройку своего пакета на PyPI:https://pypi.org/manage/project/django-nova/settings/
Прокрути до «Издательское дело».
Добавь «Ожидающий издатель»: выбери свой репозиторий GitHub, имя воркфлоука ( ) и Environment ( ).publish.ymlpypi
Готово! Теперь, когда ты создаешь Release на GitHub ( ), пакет автоматически соберётся и публикуется на PyPI без единой версии.v0.2.0





