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:
-
utilisez
git+ssh://
au lieu dehttps://
dansdependency_links
comme je le ferais si j'installais la pension avecpip
. 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. Idemgit+https
etgit+http
. -
https://<username>:<password>@github.com/...
- j'ai quand même un 404. (Cette méthode ne fonctionne pas non plus aveccurl
ouwget
de la ligne de commande - bien quecurl -u <username> <repo_url> -O <output_file_name>
fonctionne.) -
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 .
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.
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
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.
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',
]
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 .
ce travail pour notre scénario:
- package est sur github en privé repo
- nous voulons l'installer dans le site-packages (pas dans ./src -e)
- pouvant utiliser les exigences d'installation de pip.txt
- 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