Comment indiquer dans requirements.txt une source github directe

448

J'ai installé une bibliothèque en utilisant la commande

pip install git+git://github.com/mozilla/elasticutils.git

qui l'installe directement à partir d'un référentiel Github. Cela fonctionne bien et je veux avoir cette dépendance dans mon requirements.txt. J'ai regardé d'autres billets comme celui-ci mais cela n'a pas résolu mon problème. Si je mets quelque chose comme

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev

dans le requirements.txtfichier, a pip install -r requirements.txtdonne la sortie suivante:

Downloading/unpacking elasticutils==0.7.dev (from -r requirements.txt (line 20))
  Could not find a version that satisfies the requirement elasticutils==0.7.dev (from -r requirements.txt (line 20)) (from versions: )
No distributions matching the version for elasticutils==0.7.dev (from -r requirements.txt (line 20))

La documentation du fichier d'exigences ne mentionne pas les liens utilisant le git+gitspécificateur de protocole, donc ce n'est peut-être tout simplement pas pris en charge.

Quelqu'un a-t-il une solution à mon problème?

Alfe
la source

Réponses:

327

La syntaxe des packages «modifiables» peut être utilisée requirements.txtpour importer des packages à partir de divers VCS (git, hg, bzr, svn) :

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils

En outre, il est possible de pointer vers un commit particulier:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils
tige
la source
3
Je n'ai pas réussi à vérifier localement une telle version modifiable (en raison de problèmes de syntaxe, probablement) et j'ai donc fini par utiliser la git+gitvariante (qui fonctionnait). Dans requirements.txtvotre version fonctionne, merci beaucoup :)
Alfe
1
Le docslien ne fonctionnait pas pour moi; J'en ai utilisé un plus ancien .
osa
42
Ce que je n'ai pas compris, c'est que la syntaxe montrée est exactement ce qui se passe dans les exigences, c'est-à-dire qu'il n'y a pas de nom de paquet avant le -e.
sauge
5
L'ajout de "-e" n'est pas nécessaire selon que vous souhaitez que le package soit en mode éditable, voir la réponse de @qff.
Sky
17
Devrait - il pas au -e git+git://lieu de -e git://? J'ai reçu un message d'erreur "devrait être soit un chemin vers un projet local ou une URL VCS commençant par svn +, git +, hg + ou bzr +" .
Bruce Wayne
424

Normalement, votre requirements.txtfichier ressemblerait à ceci:

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...

Pour spécifier un dépôt Github, vous n'avez pas besoin de la package-name==convention.

Les exemples ci-dessous mettent package-twoà jour à l' aide d'un dépôt GitHub. Le texte entre @et #indique les spécificités du package.

Spécifiez le hachage de validation ( 41b95ecdans le contexte de la mise à jour requirements.txt):

package-one==1.9.4
git+git://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1

Spécifiez le nom de la branche ( master):

git+git://github.com/path/to/package-two@master#egg=package-two

Spécifiez la balise ( 0.1):

git+git://github.com/path/to/package-two@0.1#egg=package-two

Spécifiez la version ( 3.7.1):

git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two

Notez que ce #egg=package-twon'est pas un commentaire ici, c'est pour indiquer explicitement le nom du package

Ce billet de blog a plus de discussion sur le sujet.

YPCrumble
la source
54
Parmi toutes les autres réponses, je ne peux pas croire qu'aucune d'entre elles n'ait juste montré un fichier d'exigences avec un mélange de demandes "normales" avec un git un lancé pour comparaison. J'étais tellement déconcerté par ce qui ressemblait à des -eoptions de ligne de commande ( ). Merci d'avoir montré un mélange des deux afin que je puisse mettre cela en contexte!
Hendy
Pointant vers la sortie 3.7.1avec git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-twon'a pas fonctionné pour moi. Ce qui a fonctionné pour moi, c'est git+git://github.com/path/to/[email protected]#egg=package-two.
Jean Paul
Cette réponse a été très utile. Une chose cependant. Ces git+git://...notations ont provoqué en quelque sorte des erreurs relatives à ssh sur ma boîte Linux. J'ai donc fini par les passer à la git+https://...notation, puis ils fonctionnent parfaitement.
RayLuo
174

requirements.txtpermet les façons suivantes de spécifier une dépendance sur un paquet dans un référentiel git à partir de pip 7.0: 1

[-e] git+git://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+https://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+ssh://git.myproject.org/SomeProject#egg=SomeProject
-e git+git@git.myproject.org:SomeProject#egg=SomeProject

Pour Github, cela signifie que vous pouvez le faire (remarquez l'omis -e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils

Pourquoi la réponse supplémentaire?
J'ai été quelque peu confus par le -edrapeau dans les autres réponses, alors voici ma clarification:

Le drapeau -eou --editablesignifie que le paquet est installé dans <venv path>/src/SomeProjectet donc pas dans le profond enfoui où <venv path>/lib/pythonX.X/site-packages/SomeProjectil serait autrement placé. 2

Documentation

qff
la source
9
Mais notez que si vous omettez le -esuivant, pip freezevous risquez de ne pas donner les résultats corrects pour ce package
Maccesch
82

Tout d'abord, installez avec git+gitou git+https, comme vous le savez. Exemple d'installation de kronokla branche du brabeionprojet:

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion

Deuxièmement, utilisez pip freeze > requirements.txtpour obtenir la bonne chose dans votre requirements.txt. Dans ce cas, vous obtiendrez

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master

Troisièmement, testez le résultat:

pip uninstall brabeion
pip install -r requirements.txt
osa
la source
4
pip freeze répertorie toujours le package que j'utilise en tant que version antérieure fermée. et pas une caisse directe github
Antoine Claval
4
Vous devez utiliser l'option «-e» pour «pip freeze» pour générer une URL
Janusz Skonieczny
2
pip 9.0.1:no such option: -e
sds
Tu veux dire git+https? Dans le texte que vous dites git+gitet dans le codegit+https
Antony Hatchkins
@AntonyHatchkins corrigé.
osa
17

Depuis pip v1.5, (publié le 1er janvier 2014: CHANGELOG , PR ), vous pouvez également spécifier un sous-répertoire d'un dépôt git pour contenir votre module. La syntaxe ressemble à ceci:

pip install -e git+https://git.repo/some_repo.git#egg=my_subdir_pkg&subdirectory=my_subdir_pkg # install a python package from a repo subdirectory

Remarque: En tant qu'auteur de module pip, idéalement, vous voudrez probablement publier votre module dans son propre référentiel de niveau supérieur si vous le pouvez. Pourtant, cette fonctionnalité est utile pour certains dépôts préexistants qui contiennent des modules python dans des sous-répertoires. Vous pourriez être obligé de les installer de cette façon s'ils ne sont pas publiés sur pypi également.

TrinitronX
la source
1

Je trouve qu'il est assez difficile d'obtenir pip3 (v9.0.1, tel qu'installé par le gestionnaire de paquets d'Ubuntu 18.04) pour installer réellement la chose que je lui dis d'installer. Je poste cette réponse pour gagner du temps à tous ceux qui rencontrent ce problème.

Échec de la mise dans un fichier requirements.txt:

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname

Par "échoué", je veux dire que bien qu'il ait téléchargé le code depuis Git, il a fini par installer la version originale du code, comme on le trouve sur PyPi, au lieu du code dans le dépôt sur cette branche.

Cependant, l'installation du commmit au lieu du nom de la branche fonctionne:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname
Jetez votre compte
la source
Êtes-vous sûr que votre succursale est également éloignée?
Alfe
Il ne pointait pas vers une copie locale, si c'est ce que vous vous demandez.
Jetez le compte