pip игнорирует зависимости-ссылки в setup.py
У меня есть зависимости_ ссылки в моем setup.py:
...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...
Но это не работает. Однако install_requires работает отлично. Может быть, есть другой способ настроить git repo, как это требуется для setup.py?
6 ответов
Этот ответ должен помочь. В двух словах, вам нужно указать версию (или "dev") для #egg=python-s3
так выглядит #egg=python-s3-1.0.0
,
Обновления на основе комментария @Cerin:
- В Pip 1.5.x есть флаг для включения обработки зависимых ссылок:
--process-dependency-links
, Я не проверял это, потому что я согласен с пунктом ниже. - Это обсуждение указывает на то, что использование зависимых ссылок для pip - плохая практика. Хотя эта функция была зачислена для устаревания, это больше не так. Есть действительный вариант использования для частных пакетов.
Начиная с версии 18.1 PIP URL поддерживается. Это означает, что вам больше не нужны устаревшие зависимости-ссылки. Вместо этого вы записываете зависимость прямо в список install_requires. Пример из @Chad выглядит так:
setup(
name='yourpackage',
version='1.7.5',
packages=[],
url='',
license='',
author='',
author_email='',
description='',
install_requires=[
'somepackage==1.2.0',
'repo==1.0.0 @ https://github.com/user/archive/master.zip#egg=repo-1.0.0',
'anotherpackage==4.2.1'
],
)
Для установки вашего пакета вы можете просто написать:
pip install yourpackage
(без --process-dependency-links)
Я понимаю, что это старый вопрос, но на случай, если вы окажетесь здесь, как я, это то, что сработало для меня.
У меня есть пакет на GitHub (не зарегистрированный в pypi), который опирается на другие пакеты GitHub (не-pypi). Я потратил слишком много времени, пытаясь понять, как получить пипс, чтобы справиться с этим правильно. Я включу то, что я сделал, чтобы исправить это здесь.
Помещение зависимостей в файл require.txt является предпочтительным методом перечисления зависимостей. Однако вам также необходимо заполнить install_requires в настройках. Именно на этом этапе я столкнулся с препятствием на пути pip, не желая устанавливать зависимости от GitHub.
В большинстве мест, в том числе в ответах на этот вопрос, указывается заполнить раздел зависимостей_установки. Однако вам также необходимо заполнить поле install_requires именем пакета, на который есть ссылка в dependency_links.
Например, если ваш файл require.txt содержит следующее.
somepackage==1.2.0
https://github.com/user/repo/tarball/master#egg=repo-1.0.0
anotherpackage==4.2.1
Тогда ваш установочный вызов должен выглядеть так:
setup(
name='yourpackage',
version='1.7.5',
packages=[],
url='',
license='',
author='',
author_email='',
description='',
install_requires=[
'somepackage==1.2.0',
'repo==1.0.0',
'anotherpackage==4.2.1'
],
dependency_links=[
'https://github.com/user/repo/tarball/master#egg=repo-1.0.0'
]
)
Хорошо, теперь мы настроили наш пакет; установка это следующая задача. Это где я провел много времени. Я не мог понять, почему указание зависимых_ссылок, очевидно, ничего не сделало. Хитрость заключается в том, что в некоторых случаях вам нужно установить флаг разрешить все внешние (может быть более конкретным) для pip. Например:
pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external
Вы сделали, и это работает!
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: связи с зависимостями и флаги "процесс-зависимости-ссылки" и "allow-all-external" устарели, поэтому они скоро будут удалены. В течение времени, которое я потратил, я не мог найти лучший, предпочтительный метод и все еще имел функцию пипса должным образом.
Несколько замечаний по некоторым вопросам, которые я обнаружил, в частности, по установке из частных репозиториев.
Установка из pip & setuptools имеет некоторые тонкие различия; но этот способ должен работать для обоих.
from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']
setup(
# ...
install_requires='package',
dependency_links = [
'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
.format(github_token=github_token, package=package, version=master)
]
Пара замечаний здесь:
- Для частных репозиториев вам необходимо пройти аутентификацию с GitHub; Самый простой способ, который я нашел, - это создать токен oauth, перенести его в свою среду и затем включить в URL.
- Вам нужно указать номер версии (здесь
0
) в конце ссылки, даже если в PyPI нет пакета. Это должно быть реальное число, а не слово. - Вам нужно предисловие с
git+
сказать setuptools это клонировать репозиторий, а не указывать на zip / tarball version
может быть веткой, тегом или хэшем коммита- Вам нужно поставить
--process-dependency-links
при установке из пипса
First upgrade your pip version as this is a new syntax.
pip install pip --upgrade
Then do the following:
install_requires=[
'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.zip#egg=bleualign-git-1.0.0'
]
- Version 1.0.0 and name "bluealign-git" are randomly chosen.
- The version number is necessary.
- We advisedly used the name "bleualign-git" to distinguish it from the main repository version.
Hope this helps.
Comments:
Good answer (upvoted). Also want to mention that the actual result would likely depend on the platform and/or pip version, though. I've seen when it works, or seemingly works but did not really pull the dependency from the specified link, or simply being rejected. So I would probably just use this as a short time workaround only. Stick with the mainstream way whenever possible.
Ни одно из приведенных выше решений не сработало для меня в соответствующих явных формах. Я добавляю это как еще одно решение для определенных конкретных случаев. У OP есть архив в их удаленном репо, но я оказался здесь по связанному с этим случаю: только исходный код в удаленном репо.
У меня есть зависимость, которая представляет собой удаленный частный репозиторий в Azure DevOps. я хотел бы использовать
Вот соответствующая строка моего
setup.py
...
install_requires=["packagename @ git+https://dev.azure.com/.../_git/packagename"]