Cómo establecer en require.txt una fuente directa de github

448

He instalado una biblioteca usando el comando

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

que lo instala directamente desde un repositorio de Github. Esto funciona bien y quiero tener esa dependencia en mi requirements.txt. He visto otras entradas como esta, pero eso no resolvió mi problema. Si pongo algo como

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

en el requirements.txtarchivo, un pip install -r requirements.txtresultado en la siguiente salida:

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 documentación del archivo de requisitos no menciona los enlaces que utilizangit+git especificador de protocolo, por lo que quizás esto simplemente no sea compatible.

¿Alguien tiene una solución para mi problema?

Alfe
fuente

Respuestas:

327

La sintaxis de paquetes "editables" se puede utilizar requirements.txtpara importar paquetes de una variedad de VCS (git, hg, bzr, svn) :

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

Además, es posible señalar un compromiso particular:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils
tallo
fuente
3
No logré pagar localmente una versión tan editable (probablemente debido a problemas de sintaxis) y terminé usando la git+gitvariante (que funcionó). En requirements.txtsu versión funciona, así que muchas gracias :)
Alfe
1
El docsenlace no estaba funcionando para mí; He usado uno más viejo .
osa
42
Lo que no entendí es que la sintaxis mostrada es exactamente lo que se requiere en los requisitos, es decir, no hay un nombre de paquete antes de -e.
sabio
55
Agregar "-e" no es necesario dependiendo de si desea que el paquete esté en modo editable, vea la respuesta de @qff.
Cielo
17
¿No debería ser en -e git+git://lugar de -e git://? Recibí un mensaje de error "debería ser una ruta a un proyecto local o una URL de VCS que comience con svn +, git +, hg + o bzr +" .
Bruce Wayne
424

Normalmente su requirements.txtarchivo se vería así:

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

Para especificar un repositorio de Github, no necesita la package-name==convención.

Los siguientes ejemplos se actualizan package-twoutilizando un repositorio de GitHub. El texto entre @y #denota los detalles del paquete.

Especifique hash de confirmación ( 41b95ecen el contexto de actualizado requirements.txt):

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

Especifique el nombre de la sucursal ( master):

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

Especificar etiqueta ( 0.1):

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

Especifique release ( 3.7.1):

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

Tenga en cuenta que #egg=package-twono es un comentario aquí, es indicar explícitamente el nombre del paquete

Esta publicación de blog tiene más discusión sobre el tema.

YPCrumble
fuente
54
De todas las otras respuestas, no puedo creer que ninguna de ellas mostrara un archivo de requisitos con una combinación de requisitos "normales" con un git que se incluye para comparar. Estaba tan desconcertado por lo que parecían -eopciones de línea de comandos ( ). ¡Gracias por mostrar una combinación de ambos para poder poner esto en contexto!
Hendy
Señalar el lanzamiento 3.7.1con git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-twono funcionó para mí. Lo que funcionó para mí fue git+git://github.com/path/to/[email protected]#egg=package-two.
Jean Paul
Esta respuesta fue muy útil. Una cosa sin embargo. Esa git+git://...notación de alguna manera causó errores relativos a ssh en mi caja de Linux. Así que terminé cambiándolos a git+https://...notación y luego funcionan perfectamente.
RayLuo
174

requirements.txtpermite las siguientes formas de especificar una dependencia en un paquete en un repositorio git a 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

Para Github eso significa que puede hacer (observe lo omitido -e):

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

¿Por qué la respuesta extra?
Me confundí un poco por el-e bandera de las otras respuestas así que aquí está mi aclaración:

La bandera -eo --editablesignifica que el paquete está instalado <venv path>/src/SomeProjecty, por lo tanto, no está profundamente enterrado <venv path>/lib/pythonX.X/site-packages/SomeProject, de lo contrario se colocaría. 2

Documentación

qff
fuente
99
Pero tenga en cuenta que si omite el -esiguiente, es pip freezeposible que no proporcione los resultados correctos para este paquete
Maccesch
82

Primero, instale con git+gito git+https, de cualquier manera que sepa. Ejemplo de instalación kronokde la rama del brabeionproyecto:

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

En segundo lugar, utilice pip freeze > requirements.txtpara obtener lo correcto en su requirements.txt. En este caso, obtendrás

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

Tercero, pruebe el resultado:

pip uninstall brabeion
pip install -r requirements.txt
osa
fuente
44
pip freeze todavía enumera el paquete que uso como una versión anterior cerrada. y no un pago directo de Github
Antoine Claval
44
Debe
2
pip 9.0.1:no such option: -e
sds
Quieres decir git+https? En el texto que dices git+gity en el códigogit+https
Antony Hatchkins
@AntonyHatchkins corregido.
osa
17

Desde pip v1.5, (lanzado el 1 de enero de 2014: CHANGELOG , PR ), también puede especificar un subdirectorio de un repositorio git para contener su módulo. La sintaxis se ve así:

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

Nota: Como autor de un módulo pip, lo ideal es que probablemente desee publicar su módulo en su propio repositorio de nivel superior si puede. Sin embargo, esta característica es útil para algunos repositorios preexistentes que contienen módulos de Python en subdirectorios. Es posible que se vea obligado a instalarlos de esta manera si tampoco se publican en pypi.

TrinitronX
fuente
1

Estoy descubriendo que es un poco complicado obtener pip3 (v9.0.1, como lo instaló el administrador de paquetes de Ubuntu 18.04) para instalar realmente lo que le digo que instale. Estoy publicando esta respuesta para ahorrar tiempo a cualquiera que se encuentre con este problema.

No se pudo poner esto en un archivo require.txt:

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

Por "fallido" quiero decir que si bien descargó el código de Git, terminó instalando la versión original del código, como se encuentra en PyPi, en lugar del código en el repositorio de esa rama.

Sin embargo, instalar el commmit en lugar del nombre de la sucursal funciona:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname
Tirar cuenta
fuente
¿Estás seguro de que tu sucursal también es remota?
Alfe
No apuntaba a una copia local, si eso es lo que te estás preguntando.
Deseche la cuenta el