Cómo hacer "ir a buscar" en una etiqueta específica de un repositorio de github

89

Estoy intentando compilar la base de datos InfluxDB (versión v0.8.8) usando go get github.com/influxdb/influxdb

Pero esto tira de la rama maestra y necesito la v0.8.8etiqueta.

He intentado hacer: go get github.com/influxdb/influxdb/releases/tag/v0.8.8pero esto falla diciendo que no se puede encontrar.

También he intentado hacer un habitual go getde la rama principal, y luego comprobar manualmente usando la etiqueta giten GOPATH/src/github...el fin de establecer la versión corret.

El problema con el último enfoque es que cuando trato de extraer las dependencias go get -u -f ./..., intenta encontrarlas en la rama maestra, y algunas de ellas no existen en la rama maestra ...

TL; DR : realiza go geten una etiqueta github específica y extrae las dependencias correctas.

ESala
fuente
Prueba esto ... git tag -a v0.8.8 - "Tu comentario"
Ashok Londhe
2
@AshokLondhe Está preguntando cómo usar una etiqueta go get, no cómo crear una.
wonderb0lt
@ wonderb0lt este es el comando para agregar una etiqueta.
Ashok Londhe
Creo que también intenté averiguar cómo verificar una etiqueta específica, y la última vez que lo intenté no fue posible ...
wonderb0lt
1
Eche un vistazo a esto . Cerca del final, las diapositivas ofrecen algunas alternativas de gestión de la dependencia.
wonderb0lt

Respuestas:

34

No es posible utilizar la go getherramienta. En su lugar, debe utilizar una herramienta de administración de paquetes Go de terceros o crear sus propias bifurcaciones para los paquetes que desea administrar de manera más detallada.

Hablé con un tipo que trabaja en Google y reconoció este problema / requisito, dijo que los proveedores que usaba su equipo eran voluminosos y probablemente lo resolverán pronto con las herramientas oficiales.

Lee mas:

Vendiendo en Go 1.6

Vendoring se ha liberado de la versión experimental en go 1.6 (después de que se escribió inicialmente esta publicación) que facilita el proceso de uso de etiquetas / versiones específicas de paquetes con herramientas de terceros. go gettodavía no tiene la funcionalidad para buscar etiquetas o versiones específicas.

Más sobre cómo funciona el proveedor : Comprensión y uso de la carpeta de proveedores

Módulos en Go 1.11

Go 1.11 ha lanzado características experimentales llamadas módulos para mejorar la gestión de dependencias, esperan lanzarlo como estable en Go 1.12: Información sobre módulos en Go 1.11

Robin Andersson
fuente
1
¿Puedes dar más detalles sobre la parte de Google? Hay una gran discusión sobre esto en la lista de correo de la comunidad go, ¿hay alguna otra dirección que no se haya discutido allí?
Not_a_Golfer
1
@Not_a_Golfer Era un tipo que no formaba parte del equipo de Go, pero hablaba de que actualmente utilizan el sistema de proveedores de forma interna y que era bastante voluminoso. Así que tenían interés en solucionarlo mejor con las herramientas oficiales. Creo que fue una declaración no oficial, sin embargo, lo dejará más claro.
Robin Andersson
2
AFAIK, la única propuesta es para un formato de archivo de dependencia / proveedor oficial. Esto sigue siendo genial, ya que los proyectos no estarían vinculados a una herramienta de dependencia y pueden interoperar con cualquier solución que deseen (es decir, prefiero el bloqueo de revisiones, mientras que otros prefieren la venta).
JimB
Los módulos no tratan realmente con la dependencia de los compiladores de código, lo que nos obliga a usar go get protocol-gen-go en otro lugar con la versión fija. Por lo tanto, nos hace tener que realizar un seguimiento del mismo control de versiones en 2 lugares diferentes (porque las bibliotecas están estrechamente acopladas con el generador)
Martin Kosicky
24

go mod ya está disponible.

Para aquellos que necesitan construir un binario de una etiqueta específica , aquí está mi camino:

mkdir temp
cd temp
go mod init .
go get -d -v github.com/nsqio/nsq@v1.1.0
mkdir bin
go build -o bin/nsqd.exe github.com/nsqio/nsq/apps/nsqd

Explicación:

  • El código anterior extrae NSQ v1.1.0 y build nsqd.
  • go mod init .crea un go.modarchivo en el directorio actual, que permite usarlo go getcon etiquetas revision /. (ver este enlace )
  • -d significa "sólo descargar", si desea una instalación directa, omita este indicador y los comandos de compilación debajo de esta línea.
  • -v significa "ser detallado".
  • El código anterior es para Windows. Si usa Linux, reemplace bin/nsqd.execon bin/nsqd.

El módulo descargado se almacena en %GOPATH%\pkg\mod. Si no desea contaminar su GOPATHdirectorio, cree uno nuevo y configúrelo GOPATH.

brk
fuente
4
En go 1.13, se go mod initnecesita una identificación de módulo, por ejemplogo mod init local/build
archie
11

He tenido éxito con esto:

  • Ejecute el comando get sin la etiqueta; debería clonar la rama maestra.
  • Vaya al directorio de clonación y verifique la etiqueta o rama que desee.
  • Ejecute el comando go get nuevamente, debería procesar el comando en la rama extraída.
Gregory Russell
fuente
4
En la primera ejecución, puede usar go get -d <git-url>para descargar los paquetes y omitir la instalación.
webwurst
Esto es lo que debe usarse cuando necesita una etiqueta específica, gopkg.in es demasiado restrictivo.
Hrishikesh Kumar
3

Esta pregunta es anterior a los módulos Go, pero para referencia futura, el procedimiento correcto en Go 1.11 para obtener una versión específica es el siguiente:

go get github.com/influxdb@[version]

O para obtener una etiqueta git específica:

go get github.com/influxdb@[gitref]

emidander
fuente
1

Tengo un enfoque (algo pirateado, pero funcional) para abordar este problema, al menos para los repositorios de git: a medida que los paquetes go get'ed son repositorios de control de código fuente normales, uno puede verificar las etiquetas usando herramientas git normales (podría usar git desde la línea de comando , Estoy usando Atlassian SourceTree).

Para compartir la configuración de mi paquete con mis compañeros de equipo, hice un repositorio git de mi GOPATH . Luego agregué todos los paquetes (al menos los que quería administrar de esta manera) a este repositorio como submódulo git. Esto requiere que mueva las carpetas de repositorio existentes fuera del camino y vuelva a agregarlas como submódulo git, para no confundir git. Este proceso es algo tedioso, pero ha demostrado que merece la pena:

Ahora puedo enviar y enviar a mi GOPATH-repo cada vez que uso un nuevo paquete Go. Cuando mis compañeros de equipo obtienen de este repositorio y emiten una actualización de submódulo de git (o simplemente actualizan a través de SoureTree, que lo hace automáticamente), su versión del paquete se comprueba en la misma etiqueta que la mía.

Por supuesto, esto solo funciona para paquetes bajo el control de fuente git ...

Peter Hommel
fuente