web-dev-qa-db-fra.com

Est-il possible d'utiliser pip pour installer un paquet à partir d'un référentiel privé github?

Comme le titre l'indique, j'essaie d'installer un paquet python à partir d'un dépôt privé github. Pour un référentiel public, je peux émettre la commande suivante qui fonctionne bien:

pip install git+git://github.com/Django/django.git

Cependant, si j'essaye ceci pour un dépôt privé:

pip install git+git://github.com/echweb/echweb-utils.git

Je reçois la sortie suivante:

Downloading/unpacking git+git://github.com/echweb/echweb-utils.git
Cloning Git repository git://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build
Complete output from command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build:
fatal: The remote end hung up unexpectedly

Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build...

----------------------------------------
Command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build failed with error code 128

J'imagine que c'est parce que j'essaie d'accéder à un référentiel privé sans fournir d'authentification. J'ai donc essayé d'utiliser git + ssh en espérant que pip utiliserait ma clé publique ssh pour s'authentifier:

pip install git+ssh://github.com/echweb/echweb-utils.git

Cela donne la sortie suivante:

Downloading/unpacking git+ssh://github.com/echweb/echweb-utils.git
Cloning Git repository ssh://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build
Complete output from command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build:
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build...

Permission denied (publickey).

fatal: The remote end hung up unexpectedly

----------------------------------------
Command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build failed with error code 128

Est-ce que quelqu'un sait si c'est ce que j'essaie de réaliser est possible? Si oui pouvez-vous s'il vous plaît me dire comment?

262
Adam J. Forster

Vous pouvez utiliser le schéma d'URI git+ssh, mais vous DEVEZ définir le nom d'utilisateur:

pip install git+ssh://[email protected]/echweb/echweb-utils.git

Voir la partie git@ dans l'URI?

PS: lisez également à propos de deploy keys .

PPS: Dans mon installation, le schéma d'URI "git + ssh" ne fonctionne qu'avec les exigences "modifiables":

pip install -e URI#Egg=EggName

Remember: modifiez le caractère : que git remote -v affiche en un caractère / avant d'utiliser l'adresse de la télécommande dans la commande pip:

$ git remote -v
Origin  [email protected]:echweb/echweb-utils.git (fetch)
                      ^ change this to a '/' character

Si vous oubliez, vous obtiendrez cette erreur:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known
274
oxyum

En tant que technique supplémentaire, si le référentiel privé est cloné localement, vous pouvez effectuer les opérations suivantes:

pip install git+file://c:/repo/directory

EDIT: Plus moderne, vous pouvez simplement faire ceci (et le -e signifie que vous n’aurez pas à valider les modifications avant qu’elles ne soient reflétées):

pip install -e C:\repo\directory
60
Scott Stafford

Vous pouvez le faire directement avec l'URL HTTPS comme ceci:

pip install git+https://github.com/username/repo.git

Cela fonctionne également en ajoutant simplement cette ligne dans le fichier Requirements.txt d'un projet Django, par exemple.

42
danius

Fonctionne également avec Bitbucket:

pip install git+ssh://[email protected]/username/projectname.git

Pip utilisera vos clés SSH dans ce cas.

23
gnrfan

La syntaxe du fichier de conditions est donnée ici: 

https://pip.pypa.io/en/latest/reference/pip_install.html#requirements-file-format

Donc par exemple:

-e git+http://github.com/rwillmer/Django-behave#Egg=Django-behave

si vous voulez que la source reste après l'installation

ou juste

git+http://github.com/rwillmer/Django-behave#Egg=Django-behave

si vous voulez juste qu'il soit installé.

13
Rachel

J'ai trouvé un moyen «d'installer automatiquement» un dépôt privé GitLab ne nécessitant pas d'invite de mot de passe. Cette approche utilise GitLab "Deploy Keys" et un fichier de configuration SSH pour vous permettre de déployer à l'aide de clés autres que vos clés SSH personnelles (dans mon cas, à utiliser par un bot). Peut-être que quelqu'un de gentil âme peut vérifier en utilisant GitHub.

Créez une nouvelle clé SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Le fichier devrait apparaître comme ~/.ssh/GitLab_Robot_Deploy_Key et ~/.ssh/GitLab_Robot_Deploy_Key.pub

Copiez et collez le contenu du fichier ~/.ssh/GitLab_Robot_Deploy_Key.pub dans la boîte de dialogue "Déployer les clés" de GitLab.

Tester la nouvelle clé de déploiement

La commande suivante indique à SSH d'utiliser votre nouvelle clé de déploiement pour configurer la connexion. En cas de succès, vous devriez recevoir le message suivant: "Bienvenue dans GitLab, Nom d'utilisateur!"

ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key [email protected]

Créer le fichier de configuration SSH

Ensuite, utilisez un éditeur pour créer un fichier ~/.ssh/config. Ajoutez le contenu suivant. La valeur "Host" peut correspondre à tout ce que vous voulez (souvenez-vous-en, car vous l'utiliserez plus tard). Le nom d'hôte est l'URL de votre instance GitLab. IdentifyFile est le chemin d'accès au fichier de clé SSH que vous avez créé à la première étape.

Host GitLab
  HostName gitlab.mycorp.com
  IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key

Pointez SSH vers le fichier de configuration

@oxyum nous a donné la recette pour utiliser pip avec SSH:

pip install git+ssh://[email protected]/my_name/my_repo.git

Nous devons juste le modifier un peu pour que SSH utilise notre nouvelle clé de déploiement. Nous faisons cela en pointant SSH vers l'entrée Host dans le fichier de configuration SSH. Remplacez simplement 'gitlab.mycorp.com' dans la commande par le nom d'hôte que nous avons utilisé dans le fichier de configuration SSH:

pip install git+ssh://git@GitLab/my_name/my_repo.git

Le paquet devrait maintenant s'installer sans mot de passe Invite.

Référence A
Référence B

9
JS.

Je trouvais beaucoup plus facile d'utiliser des jetons que des clés SSH. Je ne pouvais pas trouver beaucoup de bonne documentation à ce sujet, alors je suis tombé sur cette solution principalement par essais et erreurs. En outre, l’installation à partir de pip & setuptools présente quelques différences subtiles; mais cette façon devrait fonctionner pour les deux.

GitHub not (actuellement, en août 2016) offre un moyen facile d'obtenir le zip/tarball des pensions privées. Il faut 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 pensions 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 à l'URL
  • Vous devez inclure un peu le numéro de version (voici 0) à la fin du lien, même s’il n’ya pas de paquet sur PyPI. Ce doit être un nombre réel, pas un mot.
  • Vous devez commencer par git+ pour indiquer à setuptools qu’il doit cloner le référentiel, plutôt que de pointer vers un zip ou une archive.
  • version peut être une branche, une balise ou un hachage de validation
  • Vous devez fournir --process-dependency-links si vous installez à partir de pip
8
Maximilian

Lors de l'installation de github, j'ai pu utiliser:

pip install git+ssh://[email protected]/<username>/<projectname>.git#Egg=<eggname>

MAIS, comme je devais lancer pip avec Sudo, les clés SSH ne fonctionnaient plus avec github, "git clone" a échoué le "Permission denied (publickey)". Utiliser git+https m'a permis d'exécuter la commande en tant que Sudo et que github me demande mon nom d'utilisateur/mot de passe.

Sudo pip install git+https://github.com/<username>/<projectname>.git#Egg=<eggname>
7
jcarballo

Vous pouvez également installer une dépendance de référentiel privée via git + https: //github.com/... URL en fournissant des informations de connexion (nom d'utilisateur et mot de passe ou jeton de déploiement) pour curl avec le fichier .netrc :

echo "machine github.com login ei-grad password mypasswordshouldbehere" > ~/.netrc
pip install "git+https://github.com/ei-grad/my_private_repo.git#Egg=my_private_repo"
5
ei-grad

Si vous souhaitez installer des dépendances à partir d'un fichier de configuration requise sur un serveur CI ou similaire, procédez comme suit:

git config --global credential.helper 'cache'
echo "protocol=https
Host=example.com
username=${GIT_USER}
password=${GIT_PASS}
" | git credential approve
pip install -r requirements.txt

Dans mon cas, j'ai utilisé GIT_USER=gitlab-ci-token et GIT_PASS=${CI_JOB_TOKEN}.

Cette méthode présente un avantage évident: vous n’avez qu’un seul fichier d’exigences qui contient toutes vos dépendances.

1
AmirHossein

oxyum's solution convient pour cette réponse. Je tiens simplement à souligner que vous devez faire attention si vous effectuez l'installation à l'aide de Sudo, car les clés doivent également être stockées pour root (par exemple /root/.ssh).

Ensuite, vous pouvez taper

Sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git

0
Andres Romero

vous pouvez essayer 

pip install [email protected]/my_name/my_repo.git 

sans ssh: ... c'est un travail pour moi.

0
user2235670

Si vous ne souhaitez pas utiliser ssh, vous pouvez ajouter le nom d'utilisateur et le mot de passe dans l'URL https.
Le code ci-dessous suppose que vous avez un fichier appelé "pass" dans le répertoire de travail contenant votre mot de passe.

export PASS=$(cat pass)    
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git
0
sam

Si vous avez votre propre bibliothèque/paquet sur github/gitlab, vous devez ajouter une balise à valider avec une version concrète de la bibliothèque, par exemple v2.0 alors vous pouvez installer votre paquet 

pip install git+ssh://link/name/[email protected]

Cela fonctionne pour moi. D'autres solutions n'ont pas fonctionné pour moi.

0
zolty13