Как "установить пакет" пакет с зависимостями Git?
У меня есть частная библиотека под названием some-library
(фактические имена были изменены) с установочным файлом, выглядящим примерно так:
setup(
name='some-library',
// Omitted some less important stuff here...
install_requires=[
'some-git-dependency',
'another-git-dependency',
],
dependency_links=[
'git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency',
'git+ssh://[email protected]/my-organization/another-git-dependency.git#egg=another-git-dependency',
],
)
Все эти зависимости Git могут быть частными, поэтому установка через HTTP не является вариантом. Я могу без проблем использовать python setup.py install
и python setup.py develop
в some-library
корневом каталоге.
Однако установка более Git не работает:
pip install -vvv -e 'git+ssh://[email protected]/my-organization/[email protected]#egg=some-library'
Команда не работает, когда она ищет some-git-dependency
, ошибочно полагает, что ей нужно получить зависимость от PyPI, а затем сбой после ее завершения не на PyPI. Мое первое предположение заключалось в попытке повторного запуска команды с помощью --process-dependency-links
, но потом это произошло:
Cannot look at git URL git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency
Could not find a version that satisfies the requirement some-git-dependency (from some-library) (from versions: )
Почему это порождает эту туманную ошибку? Каков правильный способ pip install
пакета с зависимостями Git, которые могут быть частными?
Ответы
Ответ 1
Каким образом можно установить пакет с зависимостями Git, которые могут быть частными?
Две опции
-
Используйте dependency_links
, как и вы. Подробнее см. Ниже.
-
Вдоль стороны dependency_links
в файле setup.py используйте специальный dependency-links.txt
, который собирает все необходимые пакеты. Затем добавьте этот пакет в файл требований .txt. Это моя рекомендация, как описано ниже.
# dependency-links.txt
git+ssh://[email protected]#egg=package-name1
git+ssh://[email protected]#egg=package-name2
# requirements.txt (per deployed application)
-r dependency-links.txt
В то время как опция 2 добавляет дополнительную нагрузку на управление пакетами, а именно, поддерживая зависимость dependency-links.txt до настоящего времени, упрощает установку пакетов, поскольку вы можете "забыть добавить опцию --process-dependency-link
на pip install
.
Возможно, что более важно, используя dependency-links.txt вы можете указать точную версию, которая будет установлена при развертывании, которую вы хотите в среде CI/CD, - ничего более рискованно, чем устанавливать некоторую версию. Однако с точки зрения компоновщика пакетов, и считается хорошей практикой, чтобы указать минимальную версию, например
# setup.py in a package
...
install_requires = [ 'foo>1.0', ... ]
Это здорово, потому что это делает ваши пакеты хорошо работать с другими пакетами, которые имеют похожие зависимости, но, возможно, в разных версиях. Однако в развернутом приложении это все равно может вызвать хаос, если между пакетами существуют противоречивые требования. Например. пакет A в порядке с foo>1.0
, пакет B хочет foo<=1.5
, а самая последняя версия - foo==2.0
. Используя dependency-links.txt, вы можете быть конкретными, применяя одну версию для всех пакетов:
# dependency-links.txt
foo==1.5
Команда выходит из строя, когда она ищет некоторую git -зависимость,
Чтобы заставить его работать, вам нужно добавить --process-dependency-links, чтобы описать зависимость от github, например,
pip install --process-dependency-links -r private-requirements.txt
Заметьте, что pip 8.1.0 вы можете добавить эту опцию в файл требований .txt. С другой стороны, он применяется ко всем установленным пакетам и может иметь непреднамеренные последствия. Тем не менее, я считаю, что использование dependency-links.txt
является более безопасным и более управляемым решением.
Все эти зависимости Git могут быть частными
Существует три варианта:
-
Добавьте коллабораторов в каждый из репозиториев требуемых пакетов. Этим сотрудникам необходимо настроить свои ssh-ключи с помощью github для этого. Затем используйте git+ssh://...
-
Добавить ключ развертывания в каждый из репозиториев. Недостатком здесь является то, что вам необходимо распространить соответствующий закрытый ключ на все машины, которые необходимо развернуть. Снова используйте git+ssh://...
-
Добавьте токен доступа к учетной записи github, в которой хранятся частные репозитории. Затем вы можете использовать git+https://[email protected]/...
Недостатком является то, что токен доступа будет иметь доступ для чтения + записи ко всем репозиториям, как открытым, так и частным, в соответствующей учетной записи github. На стороне плюса больше нет необходимости распространять и управлять личными ключами для каждого репозитория, а циклический ключ намного проще. В среде, где каждый разработчик имеет доступ ко всем хранилищам, я нашел, что это самый эффективный, беспроблемный способ для всех. YMMV
Ответ 2
Это должно работать и для частных репозиториев:
dependency_links = [
'git+ssh://[email protected]/my-organization/[email protected]#egg=some-git-dependency',
'git+ssh://[email protected]/my-organization/[email protected]#egg=another-git-dependency'
],
Ответ 3
Если я ссылаюсь на ссылку pip install dependency links", вы не будете ссылаться на сам репозиторий GitHub, а на изображение tarball, связанное с этим репо-репитом GitHub:
dependency_links=[
'git+ssh://[email protected]/my-organization/some-git-dependency/tarball/master/#egg=some-git-dependency',
'git+ssh://[email protected]/my-organization/another-git-dependency/tarball/master/#egg=another-git-dependency',
],
с "some-git-dependency
", являющимся именем * и версией зависимости.
Ответ 4
Вы должны использовать git + git, когда url С#egg, например:
-e [email protected]:foo/my-repo.git#egg=my-repo
Используйте git + ssh в процессе производства без #egg, но вы можете указать @version или branch @master
git+ssh://[email protected]/foo/[email protected]
для работы с версиями приложений используйте git tagging Git Основы - тегирование
Ответ 5
"Невозможно посмотреть git URL git + ssh://git @github.com/my-organization/some- git -dependency.git # egg = some- git -зависимость" означает, что pip
не может извлечь html-страницу из этого URL-адреса, чтобы искать ссылки прямой загрузки на странице, т.е. pip
не распознает URL-адрес в качестве проверки vcs, потому что может быть некоторое несоответствие между спецификатором требований и фрагментом часть в URL-адресе vcs.
В случае проверки VCS вы также должны добавить #egg=project-version
, чтобы определить, какой пакет должен быть использован.
Обязательно избегайте тире в имени или версии, заменив их символами подчеркивания.
Проверить Зависимости, которые не поддерживаются в PyPI
замените -
на _
в строке пакета и версии.
git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some_git_dependency
и --allow-all-external
могут быть полезны.