Una introducción a dep: Cómo administrar las dependencias de su proyecto Golang

Actualización @ 2018-11-26: La tecnología no solo se mueve a una velocidad vertiginosa, sino que también cambia rápidamente. ¡Dentro de un año, este artículo está ACTUALIZADO!

Y de acuerdo con la página del proyecto dep:

dep fue el "experimento oficial". La cadena de herramientas Go, a partir de la versión 1.11, ha adoptado (experimentalmente) un enfoque que difiere marcadamente de dep. Como resultado, continuamos con el desarrollo de dep, pero orientando el trabajo principalmente hacia el desarrollo de un prototipo alternativo para el comportamiento de versiones en la cadena de herramientas.

Para obtener más información sobre la nueva administración integrada de Go, consulte la Wiki oficial de GitHub - Módulos Go 1.11.

Gracias a John Arundel @bitfield y Erhan Yakut @yakuter por revelar el problema. ?

-

Actualización @ 2018–02–03: Sam Boyer del equipo de godep ha aclarado información incorrecta en este artículo. Pido disculpas a Sam Boyer y a los lectores por cualquier inconveniente. ?

-

Anteriormente, publiqué un artículo sobre la gestión de dependencias en Go usando Glide. Recibí un comentario de que Glide se volverá obsoleto. El equipo de Glide sugiere que los usuarios se cambien a otra herramienta de administración de dependencias llamada dep escrita por el equipo de Golang.

La comunidad Go ahora tiene el proyecto dep para administrar las dependencias. Considere intentar migrar de Glide a dep. Glide seguirá siendo compatible durante algún tiempo, pero se considera que está en un estado de soporte en lugar de desarrollo de funciones activas.

Hay un plan sobre la integración de dep en la cadena de herramientas en la versión Go 1.10, pero parece que todavía le queda mucho camino por recorrer.

Actualización @ 2018–02–03:

  • dep se lanza oficialmente.
  • dep no se está moviendo hacia la cadena de herramientas con 1.10. consulte la hoja de ruta para obtener la información más reciente.

Crea el proyecto dentro de $ GOPATH

La carpeta del proyecto debe estar dentro de $ GOPATH para poder resolver las rutas de Gopackage. Creemos un nuevo proyecto en $ GOPATH / src / gitlab.com / ykyuen / dep-example y agreguemos el siguiente archivo.

main.go

La forma de dep

Gopkg.toml y Gopkg.lock

dep lee dos archivos llamados Gopkg.toml y Gopkg.lock . Inicialicemos estos 2 archivos usando el comando dep init .

[[email protected] dep-example]$ dep init Using master as constraint for direct dep github.com/dustin/go-humanize Locking in master (bb3d318) for direct dep github.com/dustin/go-humanize

Como puede ver, el comando dep init escanea los códigos fuente y descarga todos los paquetes necesarios para el proyecto en la carpeta del proveedor .

El Gopkg.lock sirve exactamente la misma función que el glide.lock archivo. Bloquea la versión de los paquetes EXCEPTO que la versión debe mantenerse en Gopkg.toml . En resumen, el archivo Gopkg.lock se genera automáticamente y depende de las declaraciones de importación en la versión fuente controlada por Gopkg.toml .

Actualizar la versión de la dependencia

Vamos a editar el Gopkg.toml y usar una versión ligeramente más antigua del paquete go-humanizar en lugar de la última rama principal.

Luego ejecute depasegúrese de actualizar el paquete a la versión deseada. La siguiente es la diferencia del Gopkg.lock actualizado .

Agregar una nueva dependencia

Se podría agregar un nuevo paquete usando el comando dep verify -add .

[[email protected] dep-example]$ dep ensure -add github.com/leekchan/accountingFetching sources...
"github.com/leekchan/accounting" is not imported by your project, and has been temporarily added to Gopkg.lock and vendor/.If you run "dep ensure" again before actually importing it, it will disappear from Gopkg.lock and vendor/.

Ahora tenemos el nuevo paquete de contabilidad listo en la carpeta del proveedor con nuevas restricciones escritas en Gopkg.toml y bloqueadas en Gopkg.lock . Vamos a actualizar la main.go de la siguiente manera.

main.go

Y ejecútelo.

[[email protected] dep-example]$ go run main.gohello worldThat file is 83 MB.You're my 193rd best friend.You owe $6,582,491.$123,456,789.21$12,345,678.00$25,925,925.67-$25,925,925.67$123,456,789.21

El problema con el submódulo git

Una diferencia importante de dep en comparación con Glide es que se ignora el submódulo del paquete. Por ejemplo, después de agregar el paquete go-goracle / goracle por dep, el submódulo odpi en el interior está vacío y genera un error. La razón para descartar el submódulo se puede encontrar en el siguiente enlace.

  • ¿Hay planes para agregar compatibilidad con submódulos de Git?

Actualización @ 2018–02–03:

El párrafo sobre los submódulos de Git es incorrecto.

Sam Boyer escribió:

dep debería estar perfectamente bien para extraer submódulos de git en el caso que describe. Acabo de replicar lo que describe aquí localmente, y el problema no son los submódulos, es que no hay código Go en github.com/go-goracle/goracle/odpi, por lo que no se puede importar directamente. Es probable que deba desactivar la poda de paquetes no utilizados en Gopkg.toml para ese proyecto específicamente, ya que, de lo contrario, dep secure eliminará automáticamente lo que parece ser un no usado directamente (pero parece que en realidad lo usa cgo).

Actualización @ 2018–03–04:

Se descubre que el paquete go-goracle / goracle no funciona con dep. Puede seguir el problema a continuación y consultar la última actualización del equipo de depósito.

  • No se puede obtener el submódulo git de un paquete después del comando dep asegurar

Resumen

  • d̶̵̶e̶̵̶p̶̵̶ ̶̵̶i̶̵̶s̶̵̶ ̶̵̶q̶̵̶u̶̵̶i̶̵̶t̶̵̶e̶̵̶ ̶̵̶l̶̵̶i̶̵̶k̶̵̶e̶̵̶l̶̵̶y̶̵̶ ̶̵̶t̶̵̶o̶̵̶ ̶̵̶b̶̵̶e̶̵̶ ̶̵̶t̶̵̶h̶̵̶e̶̵̶ ̶̵̶o̶̵̶f̶̵̶f̶̵̶i̶̵̶c̶̵̶i̶̵̶a̶̵̶l̶̵̶ ̶̵̶d̶̵̶e̶̵̶p̶̵̶e̶̵̶n̶̵̶d̶̵̶e̶̵̶n̶̵̶c̶̵̶y̶̵̶ ̶̵̶m̶̵̶a̶̵̶n̶̵̶a̶̵̶g̶̵̶e̶̵̶m̶̵̶e̶̵̶n̶̵̶t̶̵̶ ̶̵̶t̶̵̶o̶̵̶o̶̵̶l̶̵̶ ̶̵̶i̶̵̶n̶̵̶ ̶̵̶t̶̵̶h̶̵̶e̶̵̶ ̶̵̶G̶̵̶o̶̵̶l̶̵̶a̶̵̶n̶̵̶g̶̵̶ ̶̵̶c̶̵̶o̶̵̶m̶̵̶m̶̵̶u̶̵̶n̶̵̶i̶̵̶t̶̵̶y̶̵̶.̶̵̶
  • I̶̵̶f̶̵̶ ̶̵̶y̶̵̶o̶̵̶u̶̵̶ ̶̵̶a̶̵̶r̶̵̶e̶̵̶ ̶̵̶s̶̵̶t̶̵̶a̶̵̶r̶̵̶t̶̵̶i̶̵̶n̶̵̶g̶̵̶ ̶̵̶a̶̵̶ ̶̵̶n̶̵̶e̶̵̶w̶̵̶ ̶̵̶G̶̵̶o̶̵̶l̶̵̶a̶̵̶n̶̵̶g̶̵̶ ̶̵̶p̶̵̶r̶̵̶o̶̵̶j̶̵̶e̶̵̶c̶̵̶t̶̵̶,̶̵̶ ̶̵̶d̶̵̶e̶̵̶p̶̵̶ ̶̵̶i̶̵̶s̶̵̶ ̶̵̶g̶̵̶o̶̵̶o̶̵̶d̶̵̶ ̶̵̶t̶̵̶o̶̵̶ ̶̵̶g̶̵̶o̶̵̶.̶̵̶
  • I̶f̶ ̶y̶o̶u̶ ̶a̶r̶e̶ ̶u̶s̶i̶n̶g̶ ̶G̶l̶i̶d̶e̶ ̶i̶n̶ ̶a̶ ̶l̶e̶g̶a̶c̶y̶ ̶p̶r̶o̶j̶e̶c̶t̶.̶ ̶Y̶o̶u̶ ̶c̶o̶u̶l̶d̶ ̶c̶o̶n̶s̶i̶d̶e̶r̶ ̶m̶i̶g̶r̶a̶t̶i̶n̶g̶ ̶t̶o̶ ̶d̶e̶p̶ ̶b̶u̶t̶ ̶i̶ ̶t̶h̶i̶n̶k̶ ̶t̶h̶e̶r̶e̶ ̶i̶s̶ ̶n̶o̶ ̶h̶a̶r̶m̶ ̶t̶o̶ ̶k̶e̶e̶p̶ ̶u̶s̶i̶n̶g̶ ̶G̶l̶i̶d̶e̶ ̶f̶o̶r̶ ̶a̶ ̶w̶h̶i̶l̶e̶ ̶u̶n̶t̶i̶l̶ ̶d̶e̶p̶ ̶i̶s̶ ̶o̶f̶f̶i̶c̶i̶a̶l̶l̶y̶ ̶r̶e̶l̶e̶a̶s̶e̶d̶.̶
  • I̶n̶ ̶a̶d̶d̶i̶t̶i̶o̶n̶,̶ ̶m̶i̶s̶s̶i̶n̶g̶ ̶p̶a̶c̶k̶a̶g̶e̶’̶s̶ ̶s̶u̶b̶m̶o̶d̶u̶l̶e̶ ̶m̶a̶y̶ ̶r̶e̶s̶u̶l̶t̶ ̶i̶n̶ ̶m̶a̶l̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶o̶f̶ ̶y̶o̶u̶r̶ ̶c̶o̶d̶e̶.̶
  • dep is officially released.
  • dep works well on pulling git submodule.
  • Use standard library wherever possible. (Suggested by philoserf)
  • You can checkout this example on gitlab.com.

— Originally posted on Boatswain Blog.