Pip игнорирует dependency_links в setup.py
У меня есть dependency_links в моей setup.py:
...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...
Но это не сработает. Однако install_requires работает нормально.
Возможно, существует еще один способ настройки git repo, как требуется для setup.py?
Ответы
Ответ 1
Этот ответ должен помочь. В двух словах, вам нужно указать версию (или "dev") для #egg=python-s3
чтобы она выглядела как #egg=python-s3-1.0.0
.
Обновления на основе комментария @Cerin:
- В Pip 1.5.x есть флаг для включения обработки зависимых ссылок:
--process-dependency-links
. Я не проверял это, потому что я согласен с пунктом ниже. - Это обсуждение указывает на то, что использование зависимых ссылок для pip - плохая практика. Хотя эта функция была зачислена на устаревшую версию, ее больше нет. Там действительный вариант использования для частных пакетов.
Ответ 2
Я понимаю, что это старый вопрос, но на всякий случай вы оказываетесь здесь, как я, это то, что сработало для меня.
У меня есть пакет на GitHub (не зарегистрированный в pypi), который опирается на другие пакеты GitHub (non-pypi). Я потратил чрезмерное количество времени, пытаясь понять, как заставить пипетку справиться с этим правильно. Я включу то, что я сделал, чтобы исправить это здесь.
Включение зависимостей в файле requirements.txt является предпочтительным методом перечисления зависимостей. Однако вам также необходимо заполнить install_requires в настройке. Именно на этом этапе я столкнулся с контрольно-пропускным пунктом с пиком, который не хотел устанавливать зависимости от GitHub.
В большинстве мест, включая ответы на этот вопрос, вы должны заполнить раздел настроек dependency_links. Однако вам также необходимо заполнить поле install_requires именем пакета, на который ссылаются ссылки dependency_links.
Например, если ваш файл требований .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'
]
)
Итак, теперь у нас настроен наш пакет; установка это следующая задача. Здесь я провел много времени. Я не мог понять, почему указание dependency_links, по-видимому, ничего не делало. Фокус в том, что в некоторых случаях вам нужно установить флажок allow-all-external (может быть более конкретный) для pip. Например:
pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external
Вы закончили, и он работает!
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: dependency_links и флаги process-dependency-links и allow-all-external устарели, поэтому они скоро будут удалены. За время, которое я потратил, я не смог найти лучший, предпочтительный метод и по-прежнему иметь функцию pip.
Ответ 3
Несколько заметок по некоторым проблемам, которые я нашел, в частности, для установки из частных репозиториев.
Установка из 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
, если установить из pip
Ответ 4
начиная с версии 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)
Ответ 5
Сначала обновите свою версию pip, так как это новый синтаксис.
pip install pip --upgrade
Затем сделайте следующее:
install_requires=[
'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.zip#egg=bleualign-git-1.0.0'
]
- Версия 1.0.0 и имя "bluealign-git" выбираются случайным образом.
- Номер версии необходим.
- Мы сознательно использовали имя "bleualign-git", чтобы отличить его от основной версии репозитория.
Надеюсь это поможет.
Комментарии:
Хороший ответ (голосование одобрено). Также хочу отметить, что фактический результат, вероятно, будет зависеть от платформы и/или версии пипа, хотя. Я видел, когда это работает или, по- видимому, работает, но на самом деле не извлекает зависимость из указанной ссылки или просто отклоняется. Так что я бы, вероятно, просто использовал это как временное решение проблемы. Придерживайтесь основного пути, когда это возможно.