Пакет Python Дополнительный под-пакет, если указаны дополнительные опции

Вопрос или проблема

Предположим, я создал проект на python foobar с следующим макетом:

foobar
├── __init__.py
├── core/
├── network/
└── plotting/
  1. Я хотел бы, чтобы команда pip install foobar устанавливала только основную часть пакета вместе с основными зависимостями:
foobar
├── __init__.py
└── core/
  1. Я хотел бы, чтобы команда pip install foobar[plotting] устанавливала возможности визуализации и дополнительные зависимости поверх основной установки:
foobar
├── __init__.py
├── core/
└── plotting/
  1. Я хотел бы, чтобы команда pip install foobar[all] устанавливала всё:
foobar
├── __init__.py
├── core/
├── network/
└── plotting/

Группы зависимостей для приведенных выше сценариев, похоже, просты для определения в файле pyproject.toml:

[project]
name = "foobar"
...
dependencies = [
    "foo",
    "bar",
]

[project.optional-dependencies]
network = [
    "requests",
]
plotting = [
    "PyQt6",
    "pyqtgraph",
]
all = [
    "foobar[network,plotting]",
]
dev = [
    "foobar[all]",
    "pytest",
    "ruff",
    "black",
]

Но мне неясно, могут ли содержимое пакета быть установлено так, как я намереваюсь, через какое-то определение в файле pyproject.toml. Как это можно реализовать?

Ответ или решение

Для реализации описанной вами структуры пакета Python с поддержкой условной установки подмодулей можно использовать файл конфигурации pyproject.toml. Он позволяет задавать зависимости проекта и расширенные зависимости, которые будут устанавливаться в зависимости от параметров командной строки при установке.

Структура вашего Python проекта

Ваш проект foobar имеет следующую структуру:

foobar
├── __init__.py
├── core/
├── network/
└── plotting/

1. Установка базового пакета

При выполнении команды

pip install foobar

пользователь должен получить только основную часть вашего пакета с ядром и его зависимостями. Для этого в вашем файле pyproject.toml необходимо определить инструмент установки следующим образом:

Пример содержимого pyproject.toml

[project]
name = "foobar"
version = "0.1.0"
dependencies = [
    "foo",
    "bar",
]

[project.optional-dependencies]
# Подмодуль network с дополнительными зависимостями
network = [
    "requests",
]

# Подмодуль plotting с его зависимостями
plotting = [
    "PyQt6",
    "pyqtgraph",
]

# Установка всех подмодулей и их зависимостей
all = [
    "foobar[network]",
    "foobar[plotting]",
]

# Зависимости для разработки
dev = [
    "foobar[all]",
    "pytest",
    "ruff",
    "black",
]

2. Установка подмодуля plotting

Когда пользователь хочет установить пакет с поддержкой графиков с использованием команды:

pip install foobar[plotting]

то условная логика Python пакета сработает, и в дополнение к основному коду будет установлен подмодуль plotting и его зависимости (например, PyQt6 и pyqtgraph).

3. Полная установка с помощью foobar[all]

Для установки всех компонентов пакета и их зависимостей (включая подмодули network и plotting), пользователь может выполнить:

pip install foobar[all]

Такой подход гарантирует установку всех необходимых зависимостей и полного функционала вашего пакета.

Примечания о структуре и установке

  • Зависимости: Убедитесь, что все зависимости корректно заданы и прозрачны для пользователя вашего пакета. Четкое описание и документирование пакета также улучшит взаимодействие с ним.
  • Поддержка разработки: Раздел для разработки dev позволит разработчикам легко установить все зависимости, нужные для работы и тестирования, без необходимости помнить о каждом пакете.

Заключение

Данная конфигурация позволяет легко управлять различными компонентами вашего Python-проекта и предоставляет пользователям возможность выбора, что именно они хотят установить. Это не только упрощает процесс установки, но и повышает гибкость и удобство использования вашего пакета. Со стремительным ростом популярности экосистемы Python подобный подход к управлению зависимостями будет крайне актуален среди разработчиков и конечных пользователей.

Оцените материал
Добавить комментарий

Капча загружается...