106 votes

Python setuptools : Comment puis-je lister un dépôt privé sous install_requires ?

Je crée un setup.py pour un projet qui dépend de dépôts GitHub privés. 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 car ce dernier ne supporte pas le install_requires y dependency_links arguments par este réponse.

Le fichier de configuration ci-dessus ne permet pas d'accéder aux dépôts privés avec une erreur 404 - ce qui est normal puisque GitHub renvoie une erreur 404 aux demandes non autorisées pour un dépôt privé. Cependant, je n'arrive pas à trouver comment faire en sorte que setuptools authentifier.

Voici quelques-unes des choses que j'ai essayées :

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

  2. https://<username>:<password>@github.com/... - On obtient toujours un 404. (Cette méthode ne fonctionne pas avec curl o wget à partir de la ligne de commande - bien que curl -u <username> <repo_url> -O <output_file_name> fonctionne).

  3. Mise à niveau de setuptools (0.9.7) et virtualenv (1.10) vers les dernières versions. J'ai également essayé d'installer distribute mais cet aperçu dit qu'il a été fusionné dans setuptools. Dans tous les cas, aucun résultat.

Actuellement, je n'ai que setup.py affiche un avertissement indiquant que les dépôts privés doivent être téléchargés séparément. C'est évidemment loin d'être idéal. J'ai l'impression qu'il y a quelque chose d'évident qui m'échappe, mais je n'arrive pas à trouver ce que c'est :)

Question dupliquée sans réponse aquí .

104voto

Tom Hemmes Points 671

J'essayais de faire en sorte que cela fonctionne pour l'installation avec pip, mais ce qui précède ne fonctionnait pas pour moi. D'après [1], j'ai compris que le PEP508 J'ai trouvé dans [2] un exemple qui fonctionne réellement (du moins dans mon cas).

Veuillez noter que ceci est avec pip 20.0.2 en 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>',
    ],
)

Après avoir spécifié mon paquet de cette manière, l'installation fonctionne bien (également avec -e et sans qu'il soit nécessaire de préciser --process-dependency-links ).

Références [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566

45voto

vadimg Points 584

Voici ce qui a marché 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'œuf, sinon il dira qu'il ne peut pas trouver le paquet.

11voto

Maximilian Points 1740

Je n'ai pas trouvé de bonne documentation à ce sujet, mais j'ai trouvé la solution principalement par essais et erreurs. En outre, l'installation à partir de pip et setuptools ont quelques différences subtiles, mais cette façon devrait fonctionner pour les deux.

GitHub ne propose pas (actuellement, à partir d'août 2016) un moyen facile d'obtenir le zip / tarball des dépôts privés. Vous devez donc indiquer à setuptools que vous pointez vers un repo git :

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)
        ] 

Quelques notes ici :

  • Pour les dépôts privés, vous devez vous authentifier auprès de 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 dans l'URL
  • Vous devez inclure algunos numéro de version (ici, c'est 0 ) à la fin du lien, même s'il n'y a pas de paquet sur PyPI. Il doit s'agir d'un nombre réel, pas d'un mot.
  • Vous devez commencer par git+ pour dire à setuptools qu'il doit cloner le repo, plutôt que de pointer vers un zip / tarball
  • version peut être une branche, un tag, ou un hash de commit
  • Vous devez fournir --process-dependency-links si vous installez à partir de pip

5voto

cjohnson318 Points 509

J'ai trouvé une solution de contournement (bricolée) :

#!/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 a des problèmes éthiques à avoir un appel système dans un script d'installation, mais je ne peux pas penser à une autre façon de le faire.

4voto

PidgeyBE Points 61

Grâce à la réponse de Tom Hemmes, j'ai découvert que c'est la seule chose qui a fonctionné pour moi :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X