Как указать рекурсивные зависимости в setup.py? - PullRequest
1 голос
/ 26 апреля 2019

Мне трудно понять и реализовать некоторые детали упаковки Python, используя pip и setuptools.

Предположим, у меня есть три проекта,A и B и C, каждый из которых является собственным пакетом и размещен в собственном репо кода.Они также зависят друг от друга, то есть A импортируется B, а B импортируется C.Каждый пакет имеет набор прямых зависимостей (то есть напрямую импортированных других пакетов) и набор косвенных зависимостей (то есть пакетов, импортированных непосредственно зависимыми пакетами).Эти зависимости являются графиком, а не деревом.

Для пакета A, должен ли setup.py содержать только непосредственно зависимые пакеты?То же самое для пакета B?Когда я тогда pip install C заметил, что устанавливается B, но не A.Я полагаю, это потому, что A является косвенной зависимостью для C.

. Мне не очень нравится идея хранить pip freeze в каждом пакете (негибкость и конфликты.loom), но кажется, что pip не разрешает граф зависимостей рекурсивно (см. здесь ).Проект snakebasket попытался решить эту проблему, но сейчас он устарел;опция dependency-links устарела.

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

Добавление Я забыл упомянуть, что нет пакетов (A, B, C) доступны через официальное репо PyPi , но живут в частных репозиториях Github.Так, например, B файл setup.py содержит

install_requires=(
    …,
    A==1.0.0,
    …,
    )

dependency_links=[                                                                                        
    f"https://{github_token}@github.com/repo/A/archive/v1.0.0.tar.gz#egg=A-1.0.0",
    ],

, а C содержит аналогичные настройки для пакета B.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Как указать рекурсивные зависимости в setup.py?

Не надо.

Каков правильный и рекомендуемый способ обработки этого?

setup.py должен перечислить прямые зависимости в install_requires=[...].Не перечисляйте переходные зависимости.И не закрепляйте здесь зависимости (хотя в некоторых случаях вы можете указать верхнюю или нижнюю границу, чтобы обеспечить сбор совместимой версии).

Когда я тогда pip install C заметилB устанавливается, но не A.

Тогда B неправильно указывает зависимость от A.Проверьте еще раз метаданные B.

Это верно , что pip иногда не может правильно разрешить дерево зависимостей, и существует открытая проблема с этим , так как2013, но вы не увидите его в простом графике зависимостей C -> B ->, только в некоторых других патологических случаях.

Проверьте мой проект johnnydep для рендерингадерево dep и укажите, где вы пропускаете «ветку» в метаданных пакета.

0 голосов
/ 26 апреля 2019

Для пакета A, должен ли setup.py содержать только непосредственно зависимые пакеты?

Да. Разделение проблем: каждый пакет должен перечислять зависимости, которые ему требуются. Подпакеты должны заботиться о себе.

Когда я тогда pip install C я заметил, что B устанавливается, но не A.

Можете показать пример? У меня другой опыт.

похоже, что pip не разрешает граф зависимостей рекурсивно (см. здесь ).

Ответ с 2015 года устарел. pip install и pip download рекурсивно устанавливает и загружает зависимости.

...