Masalah module adalah kelas galat yang paling sering menghentikan pemula Go: import tidak ketemu, checksum cocok tidak, atau versi dependency “aneh”. Kabar baiknya, go tooling merancang pesan galatnya secara deskriptif — kalau kita tahu cara membacanya. Chapter ini menyusun tabel masalah → gejala → solusi, menjelaskan cara kerja resolusi versi MVS, dan menutup dengan dua demo nyata yang dijalankan langsung di lingkungan Go 1.27.
Masalah Module Paling Umum #
Sebelas masalah berikut menutup hampir semua kejadian sehari-hari. Cari gejalanya di kolom tengah, lalu terapkan solusinya:
| Masalah | Gejala di terminal | Solusi |
|---|---|---|
| Module tidak ditemukan | no required module provides package ... | Perbaiki path import (typo), lalu go get <path> |
| Versi tidak resolve via proxy | galat unduh dari proxy.golang.org | GOPROXY=direct go mod tidy untuk ambil langsung |
| Checksum tidak cocok | checksum mismatch di go.sum | go mod tidy; modul privat: set GOPRIVATE |
| Import cycle | import cycle not allowed | Pindahkan tipe bersama ke package ketiga |
| Entry go.sum hilang | missing go.sum entry | go mod tidy atau go mod download <modul> |
| Versi ganda (MVS) | versi terpilih tak sesuai harapan | go list -m all, naikkan dengan go get |
replace sementara tertinggal | hasil lokal ≠ hasil CI | Hapus replace sebelum rilis |
| Toolchain lebih tua | go.mod requires go >= 1.x | Set GOTOOLCHAIN=auto atau perbarui Go |
| Vendor tidak sinkron | inconsistent vendoring | go mod vendor ulang |
| Mode GOPATH lama | perilaku import jadul | GO111MODULE=on (bawaan Go modern) |
| Dependency tak terpakai menumpuk | go.mod penuh require usang | go mod tidy berkala |
Demo Nyata: go mod tidy Membersihkan Dependency #
Demo berikut dibuat di direktori sementara. Module baru diinisialisasi, satu dependency ditambahkan lewat go get, tetapi kode belum mengimpor dependency tersebut:
go mod init example.com/lampiran-demo
go get github.com/google/[email protected]Output yang Dihasilkan:
go: creating new go.mod: module example.com/lampiran-demo
go: added github.com/google/uuid v1.6.0Isi go.mod setelah kedua perintah di atas memuat satu baris require:
module example.com/lampiran-demo
go 1.27.2
require github.com/google/uuid v1.6.0 // indirectPenanda // indirect menyatakan modul utama belum mengimpor package tersebut. Perintah diagnosis memperkuat dugaan itu:
go mod why github.com/google/uuidOutput yang Dihasilkan:
# github.com/google/uuid
(main module does not need package github.com/google/uuid)Sekarang jalankan pembersihannya, lalu periksa go.mod kembali:
go mod tidy && cat go.modOutput yang Dihasilkan:
module example.com/lampiran-demo
go 1.27.2Baris require github.com/google/uuid lenyap tanpa jejak: go mod tidy memindai seluruh import aktual, menjaga go.mod dan go.sum hanya memuat yang benar-benar dipakai. Perintah ini bekerja senyap ketika sukses — bukti keberhasilannya memang dibaca dari isi go.mod, bukan dari keluaran terminal.
MVS: Versi Minimal, Bukan Versi Terbaru #
Kejutan klasik pemula: dua dependency sama-sama butuh golang.org/x/text, yang satu menyatakan v0.14.0 dan yang lain v0.16.0, lalu Go memilih… v0.16.0 — bukan versi terbaru yang ada (saat demo ini dibuat, v0.43.0). Inilah Minimal Version Selection (MVS): dari semua versi yang dibutuhkan module graph, Go memilih versi terkecil yang masih memenuhi seluruh kebutuhan.
Demo berikut dibangun dari tiga module lokal — moda me-require x/text v0.14.0, modb me-require v0.16.0, dan module utama menggabungkan keduanya lewat replace:
go list -m allOutput yang Dihasilkan:
example.com/aplikasi
example.com/moda v0.0.0 => ../moda
example.com/modb v0.0.0 => ../modb
golang.org/x/text v0.16.0Baris terakhir adalah hasil MVS. Ketika modb diturunkan ke v0.9.0, terpilih menjadi v0.14.0 — kebutuhan tertinggi kini milik moda:
| Kebutuhan di module graph | Versi terpilih |
|---|---|
moda: v0.14.0 saja | v0.14.0 (bukan v0.43.0 terbaru) |
moda: v0.14.0 + modb: v0.16.0 | v0.16.0 |
moda: v0.14.0 + modb: v0.9.0 | v0.14.0 |
Demo: Galat missing go.sum entry #
Skenario kedua: kode sudah mengimpor uuid, tetapi berkas go.sum terhapus (kesalahan merge atau .gitignore berlebihan). Program demo mengurai UUID tetap agar outputnya deterministik:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.MustParse("123e4567-e89b-12d3-a456-426614174000")
fmt.Println("ID tetap:", id)
}Hapus go.sum lalu jalankan:
rm go.sum && go run .Output yang Dihasilkan:
main.go:6:2: missing go.sum entry for module providing package github.com/google/uuid (imported by example.com/lampiran-demo); to add:
go get example.com/lampiran-demoPesan galat ini jujur: checksum modul uuid tidak tercatat, dan saran perbaikannya tertera. Cara paling lazim adalah go mod tidy, yang mengunduh modul dan menulis ulang kedua checksum — hash go.mod dan hash isi modul — ke go.sum:
go mod tidy && go run .Output yang Dihasilkan:
ID tetap: 123e4567-e89b-12d3-a456-426614174000Perintah Diagnosis untuk Harian #
Empat perintah berikut menutupi hampir seluruh sesi troubleshooting module:
| Perintah | Jawaban yang diberikan |
|---|---|
go mod tidy | Apa require minimum yang benar-benar dibutuhkan? |
go mod why <path> | Siapa yang mengimpor package ini? |
go mod verify | Apakah cache modul lokal masih cocok dengan checksum? |
go list -m all | Versi apa yang terpilih untuk tiap modul (MVS)? |
Rumus praktisnya: mulai dari go list -m all untuk melihat peta, go mod why untuk menelusuri pemakai, dan go mod tidy sebagai penutup yang merapikan. Kebingungan module yang tersisa biasanya selesai dengan tiga perintah ini.
Module yang sehat membuat proyek berjalan mulus, tetapi kualitas kode di dalamnya tetap butuh pemeriksaan manusia. Daftar periksa untuk pemeriksaan itu kita susun di chapter Checklist Code Review .
Referensi #
- Go Modules Reference — definisi resmi go.mod, go.sum, MVS, dan resolusi versi.
- Using Go Modules — artikel blog pengantar perintah module.
- Go Modules Wiki — kumpulan resep troubleshooting komunitas.