Python setuptools: Як я можу перерахувати приватний репозиторій у розділі install_requires?


86

Я створюю 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для цієї відповіді.

Вищезазначений файл налаштування не може отримати доступ до приватних репозиторіїв з помилкою 404 - чого і слід було очікувати, оскільки GitHub повертає 404 до несанкціонованих запитів на приватне сховище. Однак я не можу зрозуміти, як зробити setuptoolsавтентифікацію.

Ось кілька речей, які я спробував:

  1. Використовуйте git+ssh://замість https://in, dependency_linksяк це було б, якби я встановлював репо за допомогою pip. Це не вдається, оскільки setuptools не розпізнає цей протокол ("невідомий тип URL-адреси: git + ssh"), хоча в документації розповсюдження сказано, що він повинен. Так само git+httpsі git+http.

  2. https://<username>:<password>@github.com/...- до сих пір отримати 404. (Цей метод не працює з curlабо wgetз командного рядка або - хоча curl -u <username> <repo_url> -O <output_file_name>робить роботу.)

  3. Оновлення setuptools (0.9.7) та virtualenv (1.10) до останніх версій. Також спробував встановити дистрибутив, хоча в цьому огляді сказано, що він був об’єднаний назад у setuptools. У будь-якому випадку, без кісток.

Наразі я просто setup.pyроздрукував попередження про те, що приватні репозиторії потрібно завантажувати окремо. Це, очевидно, менше ідеалу. Я відчуваю, що чогось очевидного, чого мені не вистачає, але не можу думати, що це може бути. :)

Дубльоване запитання, тут немає відповідей .


Прийміть рішення.
wieczorek1990

Відповіді:


69

Я намагався змусити це працювати для встановлення за допомогою pip, але вищезазначене не працювало для мене. З [1] я зрозумів, що PEP508слід використовувати стандарт, з [2] я отримав приклад, який насправді працює (принаймні для мого випадку).

Будь ласка, запиши; це з pip 20.0.2наPython 3.7.4

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
         # Private repository
        '<dependency_name> @ git+ssh://git@github.com/<user>/<repo_name>@<branch>',
         # Public repository
        '<dependency_name> @ git+https://github.com/<user>/<repo_name>@<branch>',
    ],
)

Після вказівки мого пакету встановлення працює нормально (також з -eналаштуваннями та без необхідності вказувати --process-dependency-links).

Список літератури [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566


Зараз ця #egg=...частина здається непотрібною.
Huazuo Gao,

1
Дякую! Ви абсолютно праві, обидва #eggі branchє необов’язковими (див. Редагування), і це також працює для git+https.
Том Хеммес,

1
Якщо ви використовуєте ssh://та натрапляєте на Could not resolve hostnameзміну :на /у вашій адресі клону. У мене сталася ця помилка з gitlab.
delijati

11
Здається, це вже не працює, оскільки setuptools, здається, шукає пакет на PyPi з іменем залежності:, Reading https://pypi.org/simple/some-fake-name/а потім Couldn't find index page for 'some_fake_name' (maybe misspelled?). Врешті-решт, остання відображена помилкаerror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://git@github.com/cglacet/quadtree.git')
cglacet

1
Наголосимо, що <dependency_name> не те саме, що <repo_name> І ви можете замінити 'ssh: // git @' на 'https: //', якщо це публічне репо
Phil P

41

Ось, що мені вдалося:

  install_requires=[
      'private_package_name==1.1',
  ],
  dependency_links=[
      'git+ssh://git@github.com/username/private_repo.git#egg=private_package_name-1.1',
  ]

Зверніть увагу, що ви повинні вказати номер версії в назві яйця, інакше він скаже, що не може знайти упаковку.


3
Hi vadimg - Яку версію setuptools / distribute ти використовуєш? Я отримую "Невідомий тип URL-адреси: git + ssh", використовуючи distribute 0.7.3 (остання версія).
Eric P

2
Це не спрацювало у мене через 3 роки ... Отримав: Не вдалося знайти версію, яка відповідає цій вимозі
jsmedmar

7
Станом на 28 жовтня 2016 р. Такий підхід здається розбитим
Макс.

1
З сучасними піпами вам потрібно включити опцію, щось на кшталтpip install --process-dependency-links ...
Еш Берлін-Тейлор

2
--process-dpendency-linksзастаріла, див. мою відповідь із використанням специфікації URL-адреси PEP508
Tom Hemmes

10

Я не зміг знайти жодної хорошої документації з цього приводу, але натрапив на рішення переважно шляхом спроб та помилок. Крім того, встановлення з 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

Я отримую тег неможливо знайти або повідомлення про гілку. Незважаючи на те, що приватне репо, яке я намагаюся клонувати, має тег.
trendsetter37

1
з’ясував, в чому проблема. Тег мав vдо нього приставку в github. Тому мені потрібно було використовувати v1.1.0замість 1.1.0мого скрипта setup.py.
trendsetter37

4

Я знайшов (хакі) обхідний шлях:

#!/usr/bin/env python

from setuptools import setup
import os

os.system('pip install git+https://github-private.corp.com/user/repo.git@master')

setup( name='original-name'
     , ...
     , install_requires=['repo'] )

Я розумію, що існують етичні проблеми із системним викликом у сценарії налаштування, але я не можу придумати іншого способу зробити це.


так, це також було потворним обхідним шляхом для нас через наступне: github.com/pypa/pip/issues/2822
Томмі

Тільки так я міг змусити його працювати, хоча й пішов import pip. Ні відповідь @ vadimg, ні ця пропозиція в pypa / pip не спрацювали.
gens

5
Це встановить залежність, навіть якщо запускається щось, не пов'язане з установкою, наприклад python setup.py --version.
WhyNotHugo

1

За допомогою відповіді Тома Хеммеса я виявив, що це єдине, що мені вдалося:

    install_requires=[
        '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']

0

Використання URL-адреси архіву з github мені підходить для загальних сховищ. Напр

dependency_links = [
  'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]

Як ви знаходите eggname-version?
cglacet

-1

Редагувати: Здається, це працює лише із загальнодоступними сховищами 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 задокументований у посиланні, яке ви дали для розповсюдження документації .


Я все ще отримую ту саму помилку 404. Чи репо у вашому випадку є приватними? Мені відомо про синтаксис # egg =, але я не знаю, що це впливає на автентифікацію.
Eric P

Вибачте, це, звичайно, був публічний проект репо. Ймовірно, немає жодного способу зробити це з поточними настановними інструментами, якщо https // <ім'я користувача>: <пароль> @ ... URL-адреси tarball не працюють із приватними сховищами githubs, оскільки це питання, схоже, також вказує на: наявність-завантаження -git-archive-tarballs-from-private-repo
wor

Ви також можете спробувати розробницьку версію setuptools та / або перевірити код. Відповідний код здається: package_index: fetch_distribution (): 534 package_index.py:_download_url():736
УНР

-2

Це працює для нашого сценарію:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.