Сборка устанавливаемого tar.gz / whl с поэзией с использованием локальной зависимости - PullRequest
1 голос
/ 24 сентября 2019

В моем проекте на python есть следующая структура:

├───pyproject.toml
└───mypackage
    │
    ├───lib
    │       localdep-0.2.0-py3-none-any.whl
    │       localdep-0.2.0.tar.gz
    └───service
            app.py
            home.py
            modules.py

Мне нужно собрать mypackage, используя поэзию и локальную зависимость localdep из mypackage/lib/localdep-0.2.0..., чтобы можно было установить mypackage просто используяпростая команда pip install mypackage-0.1.0.tar.gz без каких-либо дополнительных файлов.Я пытался использовать спецификаторы path и file в pyproject.toml, но постоянно получаю следующую ошибку:

ОШИБКА: не удалось найти версию, которая удовлетворяет требованию localdep (из mypackage == 0.1.0) (из версий: нет)

Текущая версия моего pyproject.toml:

[build-system]
requires = [ "poetry>=0.12",]
build-backend = "poetry.masonry.api"

[tool.poetry]
name = "myproject"
version = "0.1.0"
description = "Simple demo project."
authors = ["Some Author"]
license = "MPL 2.0"

[tool.poetry.dependencies]
python = "3.7.3"
localdep = {file = "mypackage/lib/localdep-0.2.0-py3-none-any.whl"}

Кто-нибудь знает, как передать локальную зависимость в pyproject.toml, такpoetry build сможет правильно его упаковать?

1 Ответ

1 голос
/ 25 сентября 2019

Вариант использования поэтического синтаксиса локальной зависимости отличается от того, что вам нужно, поэтому он не может решить вашу проблему здесь.

Из примеров использования в этих документах вы можете увидетьчто путь указывает на пакеты, которые не являются частью самого пакета, они всегда сначала покидают корень, например: ../some/different/location.Вся конструкция полезна только во время разработки, и ее логика будет работать с poetry install, а не poetry build.

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

Таким образом, даже если вы можете собрать свой пакет, включив в него другое колесо, которое по умолчанию не работает, потому что setuptools включает только файлы .py в sdist / bdist по умолчанию, нет никакого способачтобы pip знал, что зависимость достижима.Я вижу четыре варианта решения вашей проблемы способом, поддерживаемым Python.

  1. Используйте версию вашего localdep, установленную на pyPI , или загрузите ее туда.Но если бы это было возможно, вы бы, вероятно, не задавали этот вопрос.
  2. Если localdep находится под вашим контролем и используется только mypackage, запишите его как простой подмодуль mypackageвместо этого - прочитайте, первоначальное решение сделать localdep своим собственным пакетом было чрезмерным, что может быть или не быть правдой.
  3. Использовать способ продавца localdep, который понимает Python.Возьмите это руководство для подробного объяснения со всеми соображениями и подводными камнями, или этот хакерский пост , если вы хотите, чтобы он заработал без необходимости по-настоящему понимать, почему или как.
  4. Разверните свой пакет как "рулевую рубку".

Что такое рулевая рубка?

Для части рулевой рубки требуется немного больше текста, но это можетбыть ближе всего к тому, что вы изначально имели в виду.При таком подходе вам не нужно включать localdep в ваш проект, и всю папку mypackage/lib лучше всего удалить.localdep должен быть установлен только в ваш интерпретатор python, что вы можете убедиться, запустив pip freeze и проверив выходные данные на localdep's имя и версию.

Этот же вывод будет использован для построения указанногорубка с pip wheel -w wheelhouse $(pip freeze).Если вы не хотите включать зависимости dev, удалите свой текущий virtualenv , настройте его и введите его, прежде чем снова запустить команду wheel с poetry install; poetry shell.

Для полноты картины,вы можете собрать dist/myproject.whl с poetry build и добавить его туда, а затем вы можете просто использовать эту рулевую рубку для установки вашего пакета где угодно, запустив python -m pip install wheelhouse/* с любым python, который вы хотите.

Зачем для этого использовать pip, а не поэзию?

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

...