Управление зависимостями проекта Python в файлах pyproject.toml

Управление зависимостями в Python — сложная, а иногда и разочаровывающая работа. У новичков обычно возникает соблазн установить любую зависимость (например, пакет), которую они могут счесть полезной, даже в одной виртуальной среде. Таким образом, этот подход увеличивает вероятность наличия конфликтующих зависимостей пакетов и попадания в так называемый ад зависимостей.

В нескольких моих предыдущих статьях мы рассмотрели несколько различных методов обработки зависимостей в проектах Python с использованием файлов setup.py, setup.cfg и requirements.txt. Однако, начиная с Python 3.6, был представлен новый стандартный файл конфигурации под названием pyproject.toml, который призван упростить пользователям способ управления зависимостями и определениями метаданных.

За последние несколько лет файл pyproject.toml стал стандартным (и самым популярным) способом управления зависимостями в проектах Python. В следующих нескольких разделах мы рассмотрим, как с помощью этого файла можно реализовать управление зависимостями. Кроме того, мы также покажем, как установить проект со спецификацией pyproject.toml в редактируемом режиме.

Управление зависимостями до pyproject.toml

Когда Python был впервые выпущен, для создания дистрибутивов де-факто использовался пакет distutils. Со временем появился setuptools с целью создания дополнительных функций поверх distutils. Оба инструмента использовали файл setup.py, в котором пользователи могли указывать зависимости и метаданные, используемые как часть дистрибутива сборки пакета.

Однако это создало проблему, учитывая, что любой проект, решивший использовать setuptools, должен импортировать пакет в файл setup.py. Следовательно, setup.py нельзя выполнить, не зная его зависимостей, но в то же время назначение самого файла — определить эти зависимости. Вот так мы и пришли к так называемой проблеме курицы и яйца в управлении зависимостями Python.

Надеюсь, этой информации достаточно, чтобы понять, почему потребовался новый подход. Если вам интересно узнать больше о более подробном объяснении задачи о курице и яйце с setuptools и pip, обязательно прочитайте PEP-518.

Новый propasal, который является частью PEP-518, направлен на то, чтобы указать новый способ для проектов Python заранее перечислять свои зависимости, чтобы такие инструменты, как pip, могли убедиться, что они установлены до сборки проекта.

pyproject.toml

Файл pyproject.tom был представлен как часть предложения по улучшению Python (PEP) 518, которое указывает, как проекты Python должны указывать зависимости сборки.

Эти зависимости сборки будут храниться в файле, который находится в корневом каталоге проекта и соответствует синтаксису TOML (Tom’s Obvious, Minimal Language).

Он содержит метаданные, такие как название проекта, версия, описание, автор, лицензия и другие сведения.

Одной из ключевых особенностей файла pyproject.toml является возможность определять зависимости проекта. Это позволяет разработчикам указывать пакеты и их версии, необходимые для правильной работы проекта. Это помогает поддерживать согласованность проекта и гарантирует, что проект может быть легко воспроизведен другими разработчиками.

Файл pyproject.toml также поддерживает концепцию extras, которая позволяет разработчикам определять дополнительные зависимости для проекта. Это позволяет пользователям устанавливать только необходимые зависимости для запуска проекта. Обычно в разделе extras можно указать дополнительные требования, которые будут использоваться в рамках тестирования (например, pytest).

В дополнение к стандартным метаданным и зависимостям файл pyproject.toml также поддерживает настраиваемые поля, которые могут использоваться сторонними инструментами. В качестве примера можно рассмотреть линтеры, форматтеры и чекеры типа black и mypy. Это позволяет разработчикам расширять функциональность файла и добавлять настраиваемые поля в соответствии со своими требованиями.

Управление зависимостями в pyproject.toml

pyprojet.toml можно использовать с инструментами управления зависимостями пакетов, такими как setuptools и poetry.

Вот пример файла для проекта с использованием poetry:

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry]
name = "my-project"
version = "1.0.0"
description = "My Python project"
authors = ["John Doe <[email protected]>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.6"

[tool.poetry.dev-dependencies]
pytest = "^4.6"

[tool.poetry.extras]
docs = ["sphinx"]

А вот пример с setuptools:

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

[project]
name = "my_package"
description = "My package description"
readme = "README.rst"
requires-python = ">=3.7"
keywords = ["one", "two"]
license = {text = "BSD 3-Clause License"}
classifiers = [
    "Framework :: Django",
    "Programming Language :: Python :: 3",
]
dependencies = [
    "requests",
    'importlib-metadata; python_version<"3.8"',
]
dynamic = ["version"]

[project.optional-dependencies]
pdf = ["ReportLab>=1.2", "RXP"]
rest = ["docutils>=0.3", "pack ==1.1, ==1.3"]

[project.scripts]
my-script = "my_package.module:function"

Установка проекта в редактируемом режиме из pyproject.toml

Если вы активно разрабатываете проект, скорее всего, вы захотите установить проект локально в редактируемом режиме. При установке пакета в редактируемом режиме из определенного места любые изменения, внесенные в исходный код, будут немедленно отражены в среде (без необходимости повторной установки «новой» версии).

Предполагая, что вы используете poetry для управления зависимостями Python и для установки проекта Python в редактируемом режиме, вам необходимо иметь следующий контент в файле pyproject.toml

[build-system]
requires = ["poetry-core>=1.0.8"]
build-backend = "poetry.core.masonry.api"

и из корневого каталога проекта просто запустите

$ pip install -e .

В качестве альтернативы, poetry install также приведет к редактируемой установке. Вы можете узнать больше о том, как управлять зависимостями ваших проектов Python с помощью Poetry, в одной из моих последних статей:



Последние мысли

В сегодняшней статье мы обсудили использование pyproject.toml в Python, когда дело доходит до управления зависимостями и распространения проектов в сообществе.

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

Стать участником и читать все истории на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.



Статьи по теме, которые вам также могут понравиться