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:
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
.
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.)
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 .
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
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.
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:
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.git+
pour dire à setuptools de cloner le dépôt, plutôt que de pointer un Zip/tarballversion
peut être une branche, une balise ou un hachage de validation--process-dependency-links
si installation à partir de pipJ'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.
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',
]
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 .
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']