Golang Modules
go modules ayuda a manejar tus dependencias de golang.
Proyecto
Es un repositorio de código. Algunas veces estos proyectos pueden contener paquetes que ayudan a construir otros programas. Otras veces son aplicaciones que producen un binario. Un proyecto puede manejar más de una aplicación o más de un paquete.
El proyecto ayuda a definir el diseño, estándares y consistencia del proyecto para todo el equipo lo cual implica que todos los miembros sigan los mismos objetivos. De la misma manera, tener más de un proyecto incurre en la probabilidad de que los estándares sean diferentes.
Inicialización
Permite inicializar un proyecto de golang definiendo donde se encuentra su raíz.
$go mod init <name> #inicializa un proyecto en un namespace
$go mod init github.com/clvx/golang-lab #convención es utilizar url para el nombre
go mod init crea el archivo go.mod que indica a las herramientas de golang
que éste es un proyecto de golang que utiliza go modules donde específica el nombre
y directorio raíz del proyecto. Debería haber un solo go.mod
por proyecto; sin
embargo, si se mantienen varios servicios se puede utilizar directorios donde cada
uno tiene su propio go.mod
en vez de crear un proyecto (alias repositorio) para
cada uno de los servicios.
$cat go.mod
module github.com/clvx/golang-lab
go 1.18
La versión de go en go.mod refiere a que el proyecto es compatible con versiones
mayor o igual a 1.18 pero no con versiones inferiores a 1.18
.
Obteniendo dependencias
Las dependencias de un proyecto go son descargadas en el directorio cache definido
en la variable de entorno GOMODCACHE
para poder compilar el proyecto.
$cat main.go
package main
import (
"github.com/clvx/conf"
)
func main() {
conf.New() #crea un error
}
$go mod tidy #descargando dependencias
$go env GOMODCACHE
/home/clvx/go/pkg/mod
$ls $(go env GOMODCACHE) #listando las dependencias localmente
github.com/clvx/conf
gopls
utiliza GOMODCACHE
para habilitar IntelliSense en dependencias.
go mod tidy
go mod tidy
verifica las dependencias del paquete, busca cada una las dependencias
de acuerdo a GOPROXY
, devuelve las versiones vigentes, y realiza una petición
para obtener la versión más apropiada para compilar la aplicación, el servidor
retorna un archivo comprimido zip con el código que se descarga y descomprime
en $(go env GOMODCACHE)
. Luego, modifica go.mod
actualizando las dependencias
con sus versiones y actualiza go.sum
añadiendo un hash basado en go.mod
y otro
basado en go.sum
y go.mod
verificándolos con la Checksum DB que mantiene
Google si no existieran.
$go mod GOPROXY
https://proxy.golang.org,direct
$cat go.mod
module github.com/clvx/golang-lab
go 1.18
require github.com/clvx/conf v1.0
$cat go.sum
github.com/clvx/conf v1.0 h1:<hash_value>
github.com/clvx/conf v1.0/go.mod h1:<hash_value>
La variable de entorno GOPROXY
indica el lugar de descarga del código fuente
de las dependencias. Por defecto GOPROXY
utiliza los servidores de google como
el proxy por defecto. El servidor proxy funciona buscando en su base de datos si
existe el paquete con la versión apropiada para descargar, si no existe, se conecta
con el repositorio fuente (e.j. github.com/clvx/conf
) y obtiene un snapshot de
ese paquete y lo guarda en su base de datos, luego retorna la respuesta con el
paquete comprimido a go mod tidy
. Si existiera el paquete, retorna la respuesta
con el paquete comprimido a go mod tidy
.
Sin embargo, la opción direct
de GOPROXY
sirve para casos donde se utiliza
VCS privados donde el proxy de google no tiene acceso. Además, si se require
evitar el proxy de google completamente, se puede definir la la variable de entorno
GONOPROXY
con los dominios que se quieren evitar.
$export GONOPROXY="github.com" #set GONOPROXY
$go env GONOPROXY
github.com
$unset GONOPROXY #unsets GONOPROXY
Vendor
go mod vendor
permite includir las dependencias definidas en go.mod
que han
sido descargadas en GOMODCACHE
dentro del proyecto en el directorio vendor/
.
Vendoring es importante para compilar tu proyecto en case las dependencias no
se pueden acceder por cualquier razón.
go mod vendor
Minimal Version Selection - MVS
When installing or updating dependencies, Minimal Version Selection always selects the minimal (oldest) module version that satisfies the overall requirements of a build.
Athens
Athens es un servidor proxy open source para desplegar en tus
propios entornos. Para poder utilizar Athens se modifica GOPROXY
apuntando al
servidor proxy local. Athens también permite conectarse al servidor proxy de
Google o configurarlo para conectarse a las diferentes fuentes sin pasar por
Google. Es una buena manera para manejar tus dependencias localmente o aumentar
tu privacidad.