Setuptools Python: Comment puis-je lister un dépôt privé sous install requires?

je crée un fichier setup.py pour un projet qui dépend de dépôts privés GitHub. Les parties pertinentes du fichier ressemblent à ceci:

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/',
    ],
    ...,
)

j'utilise setuptools au lieu de distutils parce que ce dernier ne supporte pas les arguments install_requires et dependency_links par cette réponse .

le fichier de configuration ci-dessus ne parvient pas à accéder aux repos privés avec une erreur 404 - qui doit être attendu que GitHub renvoie un 404 à des requêtes non autorisées pour un dépôt privé. Cependant, je n'arrive pas à trouver comment faire authentifier setuptools .

voici quelques choses que j'ai essayées:

  1. utilisez git+ssh:// au lieu de https:// dans dependency_links comme je le ferais si j'installais la pension avec pip . Cela échoue parce que setuptools ne reconnaît pas ce protocole ("unknown url type: git+ssh"), bien que le distribuer la documentation dit qu'il devrait. Idem git+https et git+http .

  2. https://<username>:<password>@github.com/... - j'ai quand même un 404. (Cette méthode ne fonctionne pas non plus avec curl ou wget de la ligne de commande - bien que curl -u <username> <repo_url> -O <output_file_name> fonctionne.)

  3. mise à niveau setuptools (0.9.7) et virtualenv (1.10) pour les versions les plus récentes. Aussi essayé d'installer distribuer bien que cette vue d'ensemble dit qu'il a été fusionné en setuptools. De toute façon, pas de dés.

actuellement, je viens d'avoir setup.py imprimer un avertissement que les prises en pension privées doivent être téléchargées séparément. Ce n'est évidemment pas l'idéal. J'ai l'impression qu'il y a quelque chose d'évident qui me manque, mais je ne peux pas penser à ce que ça pourrait être. :)

Duplicate-question sans réponse ici .

44
demandé sur Community 2013-08-03 02:22:40

6 réponses

voici ce qui a fonctionné pour moi:

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

notez que vous devez avoir le numéro de version dans le nom de l'oeuf, sinon il dira qu'il ne peut pas trouver le paquet.

34
répondu vadimg 2013-11-27 05:47:32

Je n'ai pas pu trouver de bonne documentation à ce sujet, mais je suis tombé sur la solution principalement par tâtonnements. En outre, l'installation à partir de pip & setuptools ont quelques différences subtiles, mais cette façon devrait fonctionner pour les deux.

GitHub don'T (actuellement, à partir d'août 2016) offrent un moyen facile d'obtenir le zip / tarball des prises en pension privées. Vous devez donc pointer setuptools pour dire à setuptools que vous pointez vers un 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)
        ] 

un couple de notes ici:

  • pour les prises en pension privées, vous devez vous authentifier avec GitHub; le moyen le plus simple que j'ai trouvé est de créer un jeton oauth, de le déposer dans votre environnement, puis de l'inclure avec L'URL
  • Vous devez inclure certains numéro de version (ici c'est 0 ) à la fin du lien, même si il n'y a pas de forfait sur PyPI. Ce doit être un nombre réel, pas un mot.
  • vous devez préface avec git+ pour dire à setuptools qu'il est de cloner le repo, plutôt que de pointer vers un zip / tarball
  • version peut être d'une succursale, d'une étiquette, ou une validation de hachage
  • vous devez fournir --process-dependency-links si vous installez à partir de pip
7
répondu Maximilian 2016-08-31 16:51:41

j'ai trouvé une solution (hacky):

#!/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'] )

je comprends qu'il y ait des problèmes d'éthique à avoir un appel système dans un script de configuration, mais je ne peux pas penser à une autre façon de le faire.

4
répondu cjohnson318 2015-03-31 19:06:26

utilisant L'URL des archives de github works pour moi, pour les dépôts publics. Par exemple:

dependency_links = [
  'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]
3
répondu Overclocked 2014-04-14 13:34:24

Edit: cela ne semble fonctionner qu'avec les dépôts publics github, voir les commentaires.

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',
],

syntaxe ci-Dessus semble fonctionner pour moi avec setuptools 1.0. Pour le moment au moins la syntaxe d'ajout de "#egg=project_name-version" aux dépendances VCS est documentée dans le lien que vous avez donné à distribuer de la documentation .

1
répondu wor 2013-09-05 10:04:08

ce travail pour notre scénario:

  1. package est sur github en privé repo
  2. nous voulons l'installer dans le site-packages (pas dans ./src -e)
  3. pouvant utiliser les exigences d'installation de pip.txt
  4. pouvant utiliser pip install-e repodir (ou à partir de github), où les dépendances ne sont spécifiées que dans les exigences.txt

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

0
répondu kotrfa 2018-01-10 18:10:08