Какие инструменты используются для сборки и управления зависимостями в Python?

Ответ

Современная экосистема Python использует стандарт pyproject.toml (PEP 518) для декларативного описания сборки и зависимостей. Основные инструменты делятся на две категории:

  1. Билд-системы (Build Systems) Отвечают непосредственно за сборку пакета (sdist, wheel).

    • Setuptools: Исторически стандартный и наиболее распространенный бэкенд. Гибкий и мощный.

    Пример pyproject.toml с setuptools:

    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    [project]
    name = "my-library"
    version = "0.1.0"
    dependencies = [
        "requests >= 2.20.0",
    ]
  2. Инструменты управления проектом (All-in-One Tools) Объединяют управление зависимостями, виртуальными окружениями и сборку.

    • Poetry: Популярный инструмент, который обеспечивает детерминированные сборки с помощью файла poetry.lock. Упрощает управление зависимостями, сборку и публикацию пакетов.
    • Hatch: Мощный и расширяемый инструмент, который отлично справляется с управлением окружениями, версиями и сборкой сложных проектов.
    • PDM: Современный менеджер пакетов, поддерживающий стандарт PEP 582 (файл __pypackages__), что устраняет необходимость в virtualenv.

Рекомендации:

  • Для библиотек часто достаточно setuptools, так как он обеспечивает максимальную совместимость.
  • Для приложений Poetry или Hatch являются предпочтительным выбором, так как они предоставляют полный и удобный цикл управления проектом.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши питонячьи инструменты! Сидишь, блядь, как дурак, и думаешь: ну что там может быть сложного, собрать пакетик? Ан нет, сука, целая экосистема выросла, как грибы после дождя, ёпта!

Раньше-то был setup.py, и все в нём ковырялись, как в навозе. А теперь придумали pyproject.toml — файлик один, а туда всю свою, блядь, подноготную пихают. И всё бы ничего, да инструментов этих развелось — овердохуища!

Первая категория — это, типа, голые строители, билд-системы. Их задача — взять твой код и слепить из него красивую, блядь, сборочку, wheel там или sdist. Король тут, конечно, setuptools. Старый, блядь, мамонт, но ещё тот боец. Всё может, везде пролезет. Вот смотри, как он в pyproject.toml прописывается:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "my-library"
version = "0.1.0"
dependencies = [
    "requests >= 2.20.0",
]

Всё чётко, без лишней хуйни. Сказал, что собирать будем setuptools'ом, и поехали.

Но это, блядь, для аскетов. А народ-то хочет удобств! Хочет, чтобы за него всё делали: и зависимости подтянул, и виртуальное окружение создал, и пакет собрал, и в PyPI залил, и чай в постель принёс! Ну вот и появились эти все-in-one штуки.

Poetry, например. Модный такой, красивый. Захотел — poetry add requests, и всё, блядь, записалось в pyproject.toml и в poetry.lock. Красота! Детерминированность, ёпта! Собрал у себя — работает, собрал у соседа — тоже работает, потому что версии зафиксированы. Удобно, сука, для приложений, где надо, чтобы всё чётко встало.

Hatch — это уже для тех, кто похитрее. Мощный, расширяемый, как швейцарский нож. Хочешь — десять разных окружений под разные задачи, хочешь — автоматическое версионирование по тегам в гите. Для сложных проектов — самое то, блядь.

А PDM — это вообще, в рот меня чих-пых, революционер! Он говорит: "Нахуй эти виртуальные окружения, venv этот ваш!" И предлагает складывать зависимости прямо в папку __pypackages__ рядом с кодом. Красота! Открыл проект — и всё уже там лежит. Правда, не все IDE ещё это прожевать могут, но идея-то, блядь, охуенная!

Так что, если пишешь библиотеку, которую другие будут использовать, — не выёбывайся, бери setuptools. Максимальная совместимость, все его знают, проблем не будет. А если приложение своё лепишь, где тебе нужен полный контроль и удобство, — да похуй, бери Poetry или Hatch и не парься. Главное — чтобы работало, а не чтобы ты тут со всеми этими инструментами, как мартышлюшка, игрался.