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?
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
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
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.
Fonctionne également avec Bitbucket:
pip install git+ssh://[email protected]/username/projectname.git
Pip utilisera vos clés SSH dans ce cas.
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é.
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.
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.
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]
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
@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.
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:
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.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--process-dependency-links
si vous installez à partir de pipLors 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>
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"
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.
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
vous pouvez essayer
pip install [email protected]/my_name/my_repo.git
sans ssh: ... c'est un travail pour moi.
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
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.