Lecciones del módulo (4/5)
Módulos de Go
Un módulo Go es una unidad versionable compuesta por uno o más paquetes. Es la base del sistema de dependencia moderno (Go 1.11+): no más GOPATH, no más vendor obligatorio, dependencias explícitas y reproducibles.
go.mod: el manifiesto del módulo
module example.com/myapp
go 1.22
require (
github.com/google/uuid v1.6.0
golang.org/x/time v0.5.0
)
Tres directivas principales:
module <path>: la ruta de importación del módulo. Todos los paquetes internos se importan comoexample.com/myapp/sub/pkg. No tiene que ser una URL real, pero para publicar mediantego getdebe resolverse.go <version>: la versión mínima de Go requerida (también se usa para controlar qué funciones de idioma están permitidas, por ejemplo, rango sobre función en 1.23).require— las dependencias directas con su versión exacta.
Otras directivas: replace (sustituye un departamento por una bifurcación o una ruta local), exclude, retract.
go.sum: el archivo de bloqueo criptográfico
Además de go.mod, go.sum contiene un hash criptográfico de CADA versión descargada (incluidas las dependencias transitivas). Garantiza reproducibilidad: si alguien altera una versión publicada, la compilación falla.
Confirmarlo siempre. Se actualiza automáticamente mediante los comandos go.
Comandos esenciales
go mod init example.com/myapp # create go.mod
go get github.com/google/uuid # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./... # upgrade every dep
go mod tidy # remove unused deps, add missing ones
go mod download # download everything into the cache
go mod why github.com/x/y # explain why a dep is included
go mod graph # full dependency graphgo mod tidy es el que ejecuta después de cada cambio en las importaciones: garantiza que go.mod refleje exactamente los paquetes realmente utilizados.
Control de versiones de importación semántica (SIV)
Las versiones siguen SemVer: v1.2.3 = MAJOR.MINOR.PATCH. La parte interesante es principal v2+:
- Mayor
v0yv1→ ruta normal:github.com/foo/bar. v2mayor o posterior → la ruta incluye la versión principal:github.com/foo/bar/v2.
import "github.com/foo/bar/v2"Esto le permite importar v1 y v2 de la misma biblioteca al mismo tiempo (útil durante migraciones progresivas).
Importar rutas y paquetes internos
Si su módulo es example.com/myapp, se importa una subcarpeta utils/ como:
import "example.com/myapp/utils"La ruta depende sólo del nombre declarado en go.mod, no de la ubicación en el disco: el mismo código en una carpeta diferente sigue funcionando.
Modo de espacio de trabajo (Go 1.18+)
Para trabajar en varios módulos que hacen referencia entre sí al mismo tiempo (por ejemplo, una biblioteca y una aplicación que la utiliza):
go work init ./lib ./appEsto crea go.work: go build usará la versión local de ./lib en lugar de descargar la publicada. No confirme go.work (es un entorno de desarrollo).
Ejercicios
El módulo es example.com/myapp y contiene una subcarpeta de utilidades. Importe el subpaquete en main usando la ruta completa.
Mostrar pista
La ruta de importación es el nombre del módulo (de go.mod) más la ruta relativa de la carpeta.
Solución disponible después de 3 intentos
Convierta las importaciones individuales en un grupo de importación con la sintaxis de importación (...), importando tanto fmt como os.
Solución disponible después de 3 intentos
¿Qué comando elimina las dependencias que ya no se importan de go.mod y agrega las que faltan?
$ go mod ???