Go Modülleri, Go 1.11+ sürümünde sunulan standart bağımlılık yönetim mekanizmasıdır. Ana dosyalar go.mod (minimum bağımlılıkları ve sürümlerini tanımlar) ve go.sum (hashler aracılığıyla bütünlüğü garanti eder) dir.
Bağımlılık eklemek için kullanılır:
go get github.com/pkg/errors@v0.9.1
Bağımlılıkları güncellemek için ise:
go get -u ./... go mod tidy # kullanılmayanları sil
Go, anlamsal versiyonlamayı (semver) destekler ve bağımlılıklar sıkı bir şekilde sabitlenir: proje tekrarlanabilir, derleme deterministtir. Ancak dikkate alınması gerekenler:
go.mod dosyasını manuel olarak düzeltmek, sürüm uyumsuzluklarına ve geçişli bağımlılıklar arasında çatışmalara neden olabilir.go.sum dosyasını silerseniz ve go build komutunu çalıştırırsanız ne olur ve bu ne kadar tehlikelidir?
Birçok kişi Go'nun bağımlılıkları sıfırdan yeniden inşa edeceğini düşünmektedir. Ancak go.sum dosyası, kullanılan tüm modüllerin hashlerini içerir ve değiştirme (supply-chain attack) karşısında koruma sağlar. Eğer silinirse,
bir sonraki derlemede Go bağımlılıkları yeniden indirecek, dosyayı yeniden oluşturacak, ancak bağımlılık deposu kötü niyetli bir kişi tarafından değiştirilmişse — koruma bozulmuş olur! Üretimde kodun değiştirilmesi mümkündür.
Hikaye
Büyük bir projede, depo vendoringden go modüllerine geçiş yaptı, ancak versiyonları sabitlemeyi unuttular. Üç hafta sonra üçüncü taraf paketlerin güncellemeleri uyumluluğu bozdu, eski dalı derlemek imkansız hale geldi — kod tekrarlanabilirliği kayboldu.
Hikaye
Başka bir projede, bir geliştirici yanlışlıkla go.sum dosyasını sildi. Yeniden çalışma gerçekleştirildiğinde ekip, bazı bağımlılıkların değiştiğini fark etti, minor versiyonlarla ilgili uyumsuzluklara neden olan hatalar ortaya çıktı — bu da birkaç gün geriye dönüşe neden oldu.
Hikaye
Yerel dizinlere yönelik replace yolları (replace ... = ../some/library) dağıtım öncesi kaldırılmamıştı — CI/CD hattında derleme başarısız oldu, çünkü dış sistem yerel dosyalara erişim sağlayamadı ve üretim "yanlış" sürüme "kilitlendi".