web-dev-qa-db-fra.com

Python setuptools: Comment puis-je lister un référentiel privé sous install_requires?

Je crée un setup.py fichier pour un projet qui dépend de référentiels 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 prend pas en charge le install_requires et dependency_links arguments par cette réponse.

Le fichier d'installation ci-dessus ne parvient pas à accéder au référentiel privé avec une erreur 404 - ce qui est normal car GitHub renvoie un 404 aux demandes non autorisées pour un référentiel privé. Cependant, je n'arrive pas à comprendre comment authentifier setuptools.

Voici quelques choses que j'ai essayées:

  1. Utilisation git+ssh:// au lieu de https:// dans dependency_links comme je le ferais si l'installation du dépôt avec pip. Cela échoue car setuptools ne reconnaît pas ce protocole ("type d'URL inconnu: git + ssh"), bien que distribuer la documentation le dise. Idem git+https et git+http.

  2. https://<username>:<password>@github.com/... - obtient toujours un 404. (Cette méthode ne fonctionne pas avec curl ou 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 distribuer cet aperç indique qu'il a été réintégré dans setuptools. De toute façon, pas de dés.

Actuellement, j'ai juste 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 manque quelque chose d'évident, mais je ne peux pas penser à ce que cela pourrait être. :)

Question en double sans réponse ici .

62
Eric P

J'essayais de faire fonctionner cela pour l'installation avec pip, mais ce qui précède ne fonctionnait pas pour moi. De [1] j'ai compris que la norme PEP508 devait être utilisée, de [2] j'ai récupéré un exemple qui fonctionne réellement (au moins pour mon cas).

Notez s'il vous plaît; c'est avec pip 18.1 sur Python3.6

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
        '<dependency_name> @ git+ssh://[email protected]/<user>/<repo_name>@<branch>',
    ],
)

Après avoir spécifié mon package de cette façon, l'installation fonctionne correctement (également avec -e paramètres et sans avoir besoin de spécifier --process-dependency-links).

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

31
Tom Hemmes

Voici ce qui a fonctionné pour moi:

  install_requires=[
      'private_package_name==1.1',
  ],
  dependency_links=[
      'git+ssh://[email protected]/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 package.

40
vadimg

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

GitHub n'offre pas (actuellement, en août 2016) un moyen facile d'obtenir le Zip/tarball des dépôts privés. Vous devez donc pointer setuptools pour indiquer à setuptools que vous pointez vers un dépôt 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 avec GitHub; la manière la plus simple que j'ai trouvée est de créer un jeton oauth, déposez-le dans votre environnement, puis incluez-le avec l'URL
  • Vous devez inclure certains numéro de version (voici 0) à la fin du lien, même s'il n'y a pas de package sur PyPI. Ce doit être un nombre réel, pas un mot.
  • Vous devez faire précéder de git+ pour dire à setuptools de cloner le dépôt, plutôt que de pointer un Zip/tarball
  • version peut être une branche, une balise ou un hachage de validation
  • Vous devez fournir --process-dependency-links si installation à partir de pip
10
Maximilian

J'ai trouvé une solution de contournement (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 a des problèmes éthiques à avoir un appel système dans un script de configuration, mais je ne peux pas penser à une autre façon de procéder.

4
cjohnson318

Utiliser l'URL d'archive de github fonctionne pour moi, pour les référentiels publics. Par exemple.

dependency_links = [
  'https://github.com/username/reponame/archive/master.Zip#Egg=eggname-version',
]
1
Overclocked

Modifier: Cela semble fonctionner uniquement avec les référentiels github publics, 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',
],

La syntaxe ci-dessus semble fonctionner pour moi avec setuptools 1.0. À l'heure actuelle, au moins la syntaxe de l'ajout de "# Egg = project_name-version" aux dépendances VCS est documentée dans le lien que vous avez donné à distribuer la documentation .

0
wor

Via la réponse de Tom Hemmes, j'ai trouvé que c'était la seule chose qui fonctionnait pour moi:

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