Моя цель - создать пакет пространства имен с двумя подпакетами: foo и bar (в зависимости от foo), а затем перетащить пакет пространства имен в репозиторий git (без публикации его в PyPI), чтобы я мог установить либо подпакет, либо репо url.
Я следую этому руководству, чтобы создать структуру пространства имен:
root/
├ setup.py
└ microlibs/
├ foo/
│ ├ setup.py
│ ├ macrolib/
│ └ foo/
│ ├ __init__.py
│ ├ module1.py
│ ├ ...
│ └ moduleN.py
.
.
.
└ bar/
├ setup.py
├ macrolib/
└ bar/
├ __init__.py
├ module1.py
├ ...
└ moduleN.py
Файл setup.py foo не имеет зависимостей:
Foo/setup.py
from setuptools import setup
microlib_name = 'macrolib.foo'
setup(
name=microlib_name,
version="0.1.0",
namespace_packages=['macrolib'],
packages=[microlib_name],
install_requires=[]
)
Поскольку зависимости баров включают foo, setup.py панели включает macrolib.bar в списке install_requires:
бар /setup.py
from setuptools import setup
microlib_name = 'macrolib.bar'
setup(
name=microlib_name,
version="0.1.0",
namespace_packages=['macrolib'],
packages=[microlib_name],
install_requires=[
'macrolib.foo'
]
)
После нажатия на реплику bitbucket я могу без проблем установить macrolib.foo с подкаталогом репо.
$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=foo&egg=macrolib.foo"
С установленным macrolib.foo я также могу установить macrolib.bar без проблем в подкаталог репо.
$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"
Однако, если я попытаюсь установить macrolib.bar без установки macrolib.foo, то установка завершилась неудачно.
$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"
ошибка:
Collecting macrolib.foo (from macrolib.bar==0.1.0)
Could not find a version that satisfies the requirement macrolib.foo (from macrolib.bar==0.1.0) (from versions: )
No matching distribution found for macrolib.foo (from macrolib.bar==0.1.0)
Я предполагаю, что это из-за отсутствия ссылок dependency_links в bar/setup.py. Поэтому я пробовал разные комбинации URL-адресов ссылок, все с ошибкой с той же ошибкой.
Форматы, которые я пробовал:
dependency_links=['http://path/to/repo.git@<branch name>#"subdirectory=foo&egg=macrolib.foo"']
dependency_links=['http://path/to/repo.git@<branch name>#subdirectory=foo&egg=macrolib.foo']
dependency_links=['http://path/to/repo/tarball/<branch name>#"subdirectory=foo&egg=macrolib.foo"']
dependency_links=['http://path/to/repo/tarball/<branch name>#subdirectory=foo&egg=macrolib.foo']
dependency_links=['http://path/to/repo/archive/<branch name>.zip#"subdirectory=foo&egg=macrolib.foo"']
dependency_links=['http://path/to/repo/archive/<branch name>.zip#subdirectory=foo&egg=macrolib.foo']
ИЛИ добавьте префикс 'git+' ко всем указанным выше адресам.
Мой вопрос в том, каков правильный формат url для dependency_links, чтобы установить macrolib.foo как зависимость, или есть ли другие способы заставить его работать?
Это правильный формат (добавление "git+" и версия зависимостей):
dependency_links=['git+http://path/to/repo.git@<branch name>#subdirectory=foo&egg=macrolib.foo-0.1.0']
и вы должны спросить pip
обработать его:
pip install --process-dependency-links git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"
--process-dependency-links
действительно делает шаг на шаг ближе к решению, но все равно вызывает ту же ошибку из-за нераспознанного формата ссылок. Я только что понял, что добавлениеgit+
и «версии зависимостей» делает это правильным. Я немного отредактировал ответ, чтобы его можно было принять.