Python setuptools: как я могу перечислить приватный репозиторий в install_requires?
Я создаю файл setup.py
для проекта, который зависит от частных репозиториев GitHub. Соответствующие части файла выглядят следующим образом:
from setuptools import setup
setup(name='my_project',
...,
install_requires=[
'public_package',
'other_public_package',
'private_repo_1',
'private_repo_2',
],
dependency_links=[
'https://github.com/my_account/private_repo_1/master/tarball/',
'https://github.com/my_account/private_repo_2/master/tarball/',
],
...,
)
Я использую setuptools
вместо distutils
, потому что последний не поддерживает аргументы install_requires
и dependency_links
в ответе this.
В приведенном выше установочном файле не удается получить доступ к приватным репозиториям с ошибкой 404 - что следует ожидать, так как GitHub возвращает 404 для несанкционированных запросов для частного репозитория. Однако я не могу понять, как сделать аутентификацию setuptools
.
Вот некоторые вещи, которые я пробовал:
-
Используйте git+ssh://
вместо https://
в dependency_links
, как если бы я установил репо с pip
. Это не удается, потому что setuptools не распознает этот протокол ( "неизвестный тип URL: git + ssh" ), хотя распространяет документацию говорит, что он должен, Тоже git+https
и git+http
.
-
https://<username>:<password>@github.com/...
- все равно получите значение 404. (Этот метод не работает с curl
или wget
из командной строки - хотя curl -u <username> <repo_url> -O <output_file_name>
работает.)
-
Обновление параметров настройки (0.9.7) и virtualenv (1.10) до последних версий. Также попытался установить дистрибутив, хотя этот обзор говорит, что он был объединен обратно в setuptools. В любом случае, нет кубиков.
В настоящее время я просто setup.py
распечатываю предупреждение о том, что частные репозитории необходимо загружать отдельно. Это, очевидно, меньше идеала. Я чувствую, что там что-то очевидное, что я скучаю, но не могу думать, что это может быть.:)
Дубликат-иш вопрос без ответов здесь.
Ответы
Ответ 1
Вот что сработало для меня:
install_requires=[
'private_package_name==1.1',
],
dependency_links=[
'git+ssh://[email protected]/username/private_repo.git#egg=private_package_name-1.1',
]
Обратите внимание, что вы должны иметь номер версии в имени яйца, иначе он скажет, что не может найти пакет.
Ответ 2
Я пытался заставить это работать для установки с pip, но вышеупомянутое не работало для меня. Из [1] я понял, что следует использовать стандарт PEP508, из [2] я получил пример, который действительно работает (по крайней мере, для моего случая).
Пожалуйста, обратите внимание; это с pip 18.1
на Python3.6
setup(
name='<package>',
...
install_requires=[
'<normal_dependency>',
'<dependency_name> @ git+ssh://[email protected]/<user>/<repo_name>@<branch>',
],
)
После указания моего пакета этот способ установки работает нормально (также с настройками -e
и без необходимости указывать --process-dependency-links
).
Ссылки [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566
Ответ 3
Я не мог найти хорошую документацию по этому вопросу, но нашел решение в основном путем проб и ошибок. Кроме того, установка из pip и setuptools имеет некоторые тонкие отличия; но этот способ должен работать для обоих.
GitHub не делает (в настоящее время, по состоянию на август 2016 года) предлагает простой способ получить zip/tarball частных репозиториев. Поэтому вам нужно указать setuptools, чтобы сообщить setuptools, что вы указываете на git repo:
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
Я нашел (хакерское) обходное решение:
#!/usr/bin/env python
from setuptools import setup
import os
os.system('pip install git+https://github-private.corp.com/user/[email protected]')
setup( name='original-name'
, ...
, install_requires=['repo'] )
Я понимаю, что есть этические проблемы с системным вызовом в настройке script, но я не могу придумать другого способа сделать это.
Ответ 5
Использование архивного URL-адреса из github работает для меня, для публичных репозиториев. Например.
dependency_links = [
'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]
Ответ 6
Изменить: похоже, работает только с публичными репозиториями github, см. комментарии.
dependency_links=[
'https://github.com/my_account/private_repo_1/tarball/master#egg=private_repo_1',
'https://github.com/my_account/private_repo_2/tarball/master#egg=private_repo_2',
],
Синтаксис, похоже, работает для меня с setuptools 1.0. В настоящий момент, по крайней мере, синтаксис добавления "# egg = project_name-version" в зависимости от VCS документирован в ссылке, которую вы передали распространять документацию.
Ответ 7
Через ответ Тома Хеммеса я обнаружил, что это единственное, что сработало для меня:
install_requires=[
'<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']
Ответ 8
Эта работа для нашего сценария:
- пакет находится на github в частном репо
- мы хотим установить его в пакеты сайтов (не в. /src с -e)
- возможность использования pip install -r needs.txt
- возможность использовать pip install -e reposdir (или из github), где зависимости указаны только в файле require.txt
https://github.com/pypa/pip/issues/3610#issuecomment-356687173