DEP, el gestor de librerías y vendoring de Go

¡Ei nómadas! ¿Con ganas de programación? Hoy os traemos una entrada ligera, sin mucho código.

Hoy vamos a hablar sobre dep y como hacer vendoring en Go. Vendoring es un concepto con el que podemos asegurar que nuestro código utiliza las librerías con una versión exacta. Además, esto sirve para probar los programas con distintas librerías y ver como se comportan.

DEP gestor de librerías para Golang

Por otra parte, hay quien piensa que esto es anti-pattern, tal como sugieren aquí. Lo cierto que aferrarse a versiones especificas de una librería te limita a no recibir actualizaciones o parches de seguridad, por ejemplo.

Vamos a dejarnos de opiniones y explicaremos como usar dep. Usar dep es realmente sencillo, primero necesitamos instalarlo y para ello podemos seguir la documentación oficial. Pero para ayudar a los nómadas más noveles vamos a explicar brevemente como instalar dep.

Manual

Si nuestro sistema operativo es alguna de las principales distribuciones de linux, lo más fácil es utilizar el método manual. En resumidas cuentas ejecutaremos curl. Curl se descargará un script que a la vez se descargara la versión adecuada para el sistema operativo cuando se ejecute con el comando sh.

Mac OS X

Para sistemas operativos Mac OS X es sencillísimo con el comando brew. Este comando nos permite instalar aplicaciones como si de paquetes se tratara. Él solo se encarga de descargar las dependencias oportunas, compilarlas etc.

Para instalar dep es tan sencillo como ejecutar los siguientes comandos:

Arch

Para las distribuciones de linux Arch podemos usar el propio gestor de paquetes de Arch.

Desde el código fuente

Para el resto de sistemas operativos podemos compilar dep desde el código fuente. A continuación está el ejemplo que nos proporcionan desde la documentación oficial de dep.

Si aún así no queréis instalar terceras aplicaciones o compilar dep, podéis utilizar las versiones ya compiladas que hay en Github.

Te puede interesar  Go con Gin, el mega tutorial (II)

Cuando ya disponemos de dep instalado podemos empezar a utilizarlo en nuestros proyectos. Lo primero será tener un proyecto dentro de la ruta de proyectos o $GOPATH. Nosotros vamos a utilizar $GOPATH/src/github.com/cibernomadas/proyecto-dep.

En nuestro proyecto crearemos un fichero main.go donde empezaremos el proyecto. Podemos crear un fichero vacío o con un primer esbozo del código. A continuación nuestro main.go.

A partir de este punto podemos iniciar lo que viene siendo dep. Tan sencillo como ejecutar dep init. La salida del comando es la siguiente.

Decir que puede demorarse un poco, pues tiene que descargarse las librerías que indiquemos y esto puede variar en cada caso, según las librerías utilizadas o la conexión a Internet.

En cuanto a la salida del comando dep init podemos ver como hay varias versiones para la librería gin y de las distintas versiones se fija la versión 1.2.0. También se registran versiones de librerías necesarias para gin.

Ahora si nos fijamos en el directorio del proyecto podemos ver que se han generado los ficheros Gopkg.lockGopkg.toml, junto con una directorio vendor.

El directorio vendor contendrá las librerías que vayamos importando en nuestro proyecto y las cuales se usaran para la ejecución de nuestras aplicaciones. Cabe destacar que si utilizamos un sistema de control de versiones, como podría ser Git, es necesario indicar que el directorio vendor no se gestione como código fuente, vamos hay que excepcionarlo.

El archivo Gopkg.lock, es utilizado para fijar las versiones que estamos utilizando, pero es un archivo generado automáticamente utilizando con la información especificada en Gopkg.toml junto al código fuente, por lo que no deberemos de modificarlo manualmente.

Estados de go dep

Como se puede ver en la imagen anterior, tenemos lo que es el proyecto (src) que junto con Gopkg.toml dep genera Gopkg.lock y finalmente se utiliza la versión establecida en Gopkg.lock desde el directorio vendor para ejecutar la aplicación.

Te puede interesar  Go con Gin, el mega tutorial (VIII)

Ahora vamos a imaginar que queremos añadir una nueva librería en nuestro proyecto.

Debemos actualizar el fichero main.go con la nueva librería. Imaginemos que vamos a utilizar la librería logrus. Entonces,  añadirla al vendoring es tan fácil como actualizar el main.go y ejecutar el comando dep ensure. Dep leerá el proyecto (junto a sus dependencias y el nuevo import) y aplicará las restricciones (si queremos indicar alguna versión en concreto) que se especifican en Gopkg.toml, así finalmente generará un nuevo Gopkg.lock. Este nuevo fichero ahora tiene la nueva dependencia de logrus o la que hayamos importado.

A nosotros el fichero Gopkg.lock nos ha quedado tal que así:

Una vez llegados a este punto sería siempre igual, añadir la librería que queremos usar y ejecutar dep ensure. Pero también podemos utilizar dep ensure -add <package>. Con este último comando no es necesario haber tenido que modificar el código fuente, por ejemplo main.go.

Utilizando este segundo método para añadir librerías dep nos indica que aún no está en el proyecto y si en el próximo dep ensure no se encuentra en los imports del proyecto, la librería será eliminada.

¿Qué pasa si quiero usar una versión especifica de una librería?

Bien, como ya hemos comentado antes, el fichero Gopkg.toml es donde se establecen las restricciones o constraints (en inglés).

Como se puede ver en el fichero Gopkg.lock de antes, en el proyecto estamos utilizando la librería Logrus en su versión v1.0.5, ahora queremos usar la versión v1.0.0. Pues es tan sencillo como añadir el constraint tal cual el siguiente ejemplo o ajustar el valor de la versión en el fichero Gopkg.toml. Finalmente para fijar en el fichero la versión y que se vea reflejado en Gopkg.lock es necesario ejecutar dep ensure.

Por último nos queda conocer el comando status. Es un comando útil para conocer el estado del proyecto sin tener que mirar Gopkg.lock.

En nuestro caso la salida del comando dep status nos muestra lo siguiente:

Como se muestra podemos ver de un plumazo que librerías y con qué versiones estamos utilizando en nuestro proyecto.

Te puede interesar  Go con Gin, el mega tutorial (VI)

Una cosa más, y es que utilizando el comando graphviz junto con la salida del comando dep status -dot para generar un grafo con todas las dependencias del proyecto.

En Mac OS X ejecutamos el comando dep status -dot | dot -T png | open -f -a /Applications/Preview.app mostrando un resultado como el siguiente.

Grafo de dependencias

En la documentación de dep indican como utilizar el comando graphviz desde Linux, Mac o Windows.

Y esto es todo. En una próxima entrada hablaremos más en detalle del formato del fichero Gopkg.toml, pero por ahora es suficiente.

Pos si estáis interesados aquí tenéis un enlace con bastante información sobre herramientas de gestión de paquetes en Go. https://github.com/golang/go/wiki/PackageManagementTools

Esperamos que os haya gustado y hasta la próxima.

DEP, el gestor de librerías y vendoring de Go
Etiquetado en:         

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *