¿Cómo apuntar la dependencia del módulo Go en go.mod a una última confirmación en un repositorio?

104

A partir de v1.11 Go, se agregó soporte para módulos. Comandos

go mod init <package name>
go build

generaría archivos go.mody go.sumque contienen todas las versiones encontradas para las dependencias del paquete.

Si un módulo no tiene ninguna versión, se utiliza la última confirmación de ese módulo. Si un módulo tiene lanzamientos, el último se elige como dependencia.

Sin embargo, a veces necesitaría una funcionalidad que aún no está en una versión publicada, sino de una confirmación realizada después de esa versión. ¿Cómo configuro go.modpara apuntar no a una versión de un módulo, sino a una confirmación específica en el repositorio del módulo?

Parece que puedo hacerlo a mano. Mod con

module /my/module

require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)

donde v0.0.0no corresponde a la última etiqueta de lanzamiento publicada, 20181121201909¿sería una marca de tiempo de confirmación y af044c0995fesería el hash de confirmación? ¿Debería encontrarse e ingresar esa información a mano, o hay una mejor manera?

dimus
fuente

Respuestas:

158

Simplemente 've a buscar' el hash de confirmación que quieras:

go get github.com/someone/some_module@af044c0995fe

'go get' actualizará correctamente los archivos de dependencia (go.mod, go.sum).

Más información: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

Everton
fuente
4
En caso de que obtenga el error " revisión desconocida " o " versión no válida ", asegúrese de que no especificó el hash de PR (solicitud de extracción). Incluso un PR fusionado podría estar equivocado. Busque el hash de confirmación en el repositorio debajo /commits, pero no debajo /pulls. Vea más información aquí: golang / go # 31191 filtra explícitamente este tipo de confirmaciones.
Noam Manos
1
el OP pregunta cómo agregarlo al archivo go.mod, no cómo hacer unago get
Nulik
2
@Nulik go getes la forma correcta de actualizar / agregar de go.modla forma que solicitó el OP.
Dave C
94

Además de la respuesta de Everton sobre el uso go get github.com/someone/some_module@af044c0995fepara obtener un compromiso específico, también puede usar nombres de sucursales como:

  • go get github.com/someone/some_module@master
  • go get github.com/someone/some_module@dev_branch

Estos ejemplos obtienen la última confirmación en la rama correspondiente.

Todavía se grabará como una pseudoversión en su go.modarchivo, como v0.0.0-20171006230638-a6e239ea1c69. (Esto ayuda a proporcionar un pedido total simple en todas las versiones basado en el pedido estándar de semver ).

típico182
fuente
9
gracias por la explicación de la pseudo-versión. Estaba tratando de replaceusar una bifurcación temporal de alguna dependencia, pero no pude encontrar una manera de hacer que ese reemplazo apunte a algún compromiso. Tuve que crear una etiqueta de versión y especificarla así replace github.com/original/somelib => github.com/fork/somelib v1.2.3, lo cual es demasiado cuando solo quiero probar cosas rápidamente. replace github.com/original/somelib => github.com/fork/somelib@commithashy replace github.com/original/somelib => github.com/fork/somelib commithashno funcionan
Zhandos Zhylkaidar
6

Me he estado golpeando la cabeza durante algún tiempo sobre cómo funciona para todos y no puedo ejecutarlo. Para mí, tuve que comprometerme con la rama maestra y solo yo pude obtenerla.

Para ir a trabajar con una rama específica, ID de confirmación o etiqueta, debe habilitar una bandera para el módulo de ir ejecutando el siguiente comando

ir env -w GO111MODULE = encendido

después de esto seremos capaces de hacer

go get repo@branchname
go get repo@tag
go get repo@commithash
Chaitanya Gadkari
fuente
2

Si desea sustituir temporalmente una dependencia a un directorio local (por ejemplo, si trabaja en 2 módulos al mismo tiempo), puede agregar una replacedeclaración al final del go.modarchivo:

module example.com/mypkg

go 1.15

require (
  gitlab.com/someone/a_package v0.14.2
)

replace gitlab.com/someone/a_package => ../my_forks/a_package
dimus
fuente
0

Además, si coloca la palabra más reciente en lugar de la etiqueta en el archivo go.mod, se cambiará a la última etiqueta de los módulos.

Por ejemplo:

module /my/module

require (
...
github.com/someone/some_module latest
...
)

se convertirá

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)

despues de correr go mod tidy

JFW
fuente