A partir de v1.11 Go, se agregó soporte para módulos. Comandos
go mod init <package name>
go build
generaría archivos go.mod
y go.sum
que 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.mod
para 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.0
no corresponde a la última etiqueta de lanzamiento publicada, 20181121201909
¿sería una marca de tiempo de confirmación y af044c0995fe
sería el hash de confirmación? ¿Debería encontrarse e ingresar esa información a mano, o hay una mejor manera?
/commits
, pero no debajo/pulls
. Vea más información aquí: golang / go # 31191 filtra explícitamente este tipo de confirmaciones.go get
go get
es la forma correcta de actualizar / agregar dego.mod
la forma que solicitó el OP.Además de la respuesta de Everton sobre el uso
go get github.com/someone/some_module@af044c0995fe
para 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.mod
archivo, comov0.0.0-20171006230638-a6e239ea1c69
. (Esto ayuda a proporcionar un pedido total simple en todas las versiones basado en el pedido estándar de semver ).fuente
replace
usar 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@commithash
yreplace github.com/original/somelib => github.com/fork/somelib commithash
no funcionanMe 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
después de esto seremos capaces de hacer
go get repo@branchname go get repo@tag go get repo@commithash
fuente
Si desea sustituir temporalmente una dependencia a un directorio local (por ejemplo, si trabaja en 2 módulos al mismo tiempo), puede agregar una
replace
declaración al final delgo.mod
archivo: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
fuente
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:
se convertirá
module /my/module require ( ... github.com/someone/some_module v2.0.39 ... )
despues de correr
go mod tidy
fuente