
Al intentar construir una imagen con Docker, me encontré con el siguiente error:
go: inconsistent vendoring in /go/src/api-my-krimicell:
github.com/bradfitz/[email protected]: is marked as explicit in vendor/modules.txt, but not explicitly required in go.mod
To ignore the vendor directory, use -mod=readonly or -mod=mod.
To sync the vendor directory, run:
go mod vendor
Esto sucedió porque había eliminado la dependencia gomemcache de mi proyecto al darme cuenta de que no se estaba utilizando, pero olvidé actualizar el proyecto con el comando:
go mod tidy
Este comando sincroniza las dependencias declaradas en go.mod con lo que realmente se utiliza en el código, eliminando lo que no es necesario y añadiendo lo que falta.
Sin embargo, dado que estaba construyendo mi aplicación con Docker y el directorio vendor/ ya existía, el error persistía. El problema se debía a que el directorio vendor/ contenía referencias desactualizadas de dependencias eliminadas. En lugar de regenerar el directorio vendor/, decidí indicarle a go build que ignorara este directorio. Esto lo logré modificando mi Dockerfile de la siguiente manera:
RUN GOFLAGS=-buildvcs=false CGO_ENABLED=0 GOOS=linux \
go build -a -installsuffix cgo -ldflags="-w -s" -mod=readonly -o api-my-krimicell ./cmd/api-my-krimicell
La clave aquí es el flag -mod=readonly, que le dice a go build que ignore el directorio vendor/ y utilice las dependencias directamente de go.mod y go.sum. Esto resolvió el problema y me permitió construir la imagen correctamente.
Recuerden siempre ejecutar go mod tidy para mantener limpio su proyecto.
¡Saludos!