← Назад к вопросам

Что используешь для сборки проекта?

2.0 Middle🔥 141 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Build Tools для Python Проектов: Полный Стек

В зависимости от типа проекта, я использую разные инструменты сборки. Для Python разработки существует множество вариантов, каждый с своими плюсами и минусами. Давайте рассмотрим полный спектр.

1. Классическая Схема: setuptools + pip

Для классических Python пакетов я использую setuptools с pip для установки зависимостей. Это базовый подход, которым начинают 95% Python проектов.

# setup.py
from setuptools import setup, find_packages

setup(
    name="my-package",
    version="1.0.0",
    packages=find_packages(),
    install_requires=[
        "django>=4.0",
        "djangorestframework>=3.14",
    ],
    entry_points={
        "console_scripts": [
            "myapp=myapp.cli:main",
        ],
    },
)

2. Современный Стандарт: pyproject.toml

С Python 3.10+ рекомендуемый способ — использовать pyproject.toml согласно PEP 518/517:

[build-system]
requires = ["setuptools>=65.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "my-package"
version = "1.0.0"
requires-python = ">=3.10"
dependencies = [
    "django>=4.0",
    "djangorestframework>=3.14",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "pytest-django>=4.5",
    "black>=23.0",
    "ruff>=0.1",
]

3. Poetry: Менеджер Зависимостей

Poetry упрощает управление зависимостями и создание lock файлов для воспроизводимых сборок. Я использую его для большинства проектов:

poetry install              # Установка с lock файлом
poetry add django           # Добавить зависимость
poetry add --group dev pytest  # Dev зависимость
poetry build               # Собрать wheel + sdist
poetry publish             # Публиковать на PyPI

4. uv: Супербыстрый Менеджер

uv от создателей Ruff (написан на Rust) — это суперсовременный менеджер пакетов, работающий в 10+ раз быстрее pip:

uv pip install django          # Очень быстро
uv pip compile requirements.in  # Генерация lock файла
uv venv                         # Быстрое создание окружения

5. Makefile для Удобства Разработки

Я всегда создаю Makefile для стандартизации команд в проекте:

.PHONY: dev test lint format build clean

dev:
	pip install -e ".[dev]"

test:
	pytest tests/ --cov=myapp

lint:
	ruff check .
	black --check .

format:
	black .
	ruff check --fix .

build:
	python -m build

clean:
	rm -rf build/ dist/ *.egg-info
	find . -type d -name __pycache__ -exec rm -rf {} +

6. Docker для Production Сборки

Для production окружения я всегда использую Docker для reproducible builds:

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
RUN pip install -e .

CMD ["python", "-m", "myapp"]

7. CI/CD Pipeline (GitHub Actions)

Автоматизация сборки и тестирования через GitHub Actions:

name: Build and Test

on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10", "3.11", "3.12"]
    
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - run: pip install -e ".[dev]"
      - run: pytest tests/ --cov=myapp
      - run: ruff check .
      - run: black --check .

8. Nox для Многоверсионного Тестирования

Для тестирования на разных версиях Python используется Nox:

# noxfile.py
import nox

@nox.session(python=["3.10", "3.11", "3.12"])
def tests(session):
    session.install("-e", ".[dev]")
    session.run("pytest", "tests/")

@nox.session
def lint(session):
    session.install("-e", ".[dev]")
    session.run("ruff", "check", ".")

Сравнение Build Tools

ИнструментСкоростьФункциональностьИспользование
pipМедленноБазоваяСтарые проекты
PoetryСредняяПолнаяПакеты
uvОчень быстроПолнаяНовые проекты
DockerПересборкаВоспроизводимостьProduction
GitHub ActionsЗависитПолнаяCI/CD

Мой Типичный Workflow

  1. Инициализирую проект: poetry init или использую pyproject.toml
  2. Добавляю зависимости: poetry add package_name
  3. Создаю Makefile для удобства команд разработки
  4. Настраиваю GitHub Actions для CI/CD
  5. Создаю Dockerfile для production
  6. Использую Nox для тестирования на разных версиях Python
  7. Публикую пакет: poetry publish или через CI/CD pipeline

Всё это обеспечивает быстрой, надёжной и воспроизводимой сборки проектов от разработки до production.

Заключение

Для современной Python разработки я использую комбинацию:

  • pyproject.toml как стандарт конфигурации
  • Poetry или uv для управления зависимостями
  • Makefile для удобства разработки
  • Docker для production сборки
  • GitHub Actions для автоматизации CI/CD

Это обеспечивает простоту, скорость и надёжность сборки проектов.