Подтвердить что ты не робот

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 распечатываю предупреждение о том, что частные репозитории необходимо загружать отдельно. Это, очевидно, меньше идеала. Я чувствую, что там что-то очевидное, что я скучаю, но не могу думать, что это может быть.:)

Дубликат-иш вопрос без ответов здесь.

4b9b3361

Ответ 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

Эта работа для нашего сценария:

  1. пакет находится на github в частном репо
  2. мы хотим установить его в пакеты сайтов (не в. /src с -e)
  3. возможность использования pip install -r needs.txt
  4. возможность использовать pip install -e reposdir (или из github), где зависимости указаны только в файле require.txt

https://github.com/pypa/pip/issues/3610#issuecomment-356687173