Вопрос или проблема
Предположим, я создал проект на python foobar
с следующим макетом:
foobar
├── __init__.py
├── core/
├── network/
└── plotting/
- Я хотел бы, чтобы команда
pip install foobar
устанавливала только основную часть пакета вместе с основными зависимостями:
foobar
├── __init__.py
└── core/
- Я хотел бы, чтобы команда
pip install foobar[plotting]
устанавливала возможности визуализации и дополнительные зависимости поверх основной установки:
foobar
├── __init__.py
├── core/
└── plotting/
- Я хотел бы, чтобы команда
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 подобный подход к управлению зависимостями будет крайне актуален среди разработчиков и конечных пользователей.