ProgramlamaGo geliştirici

Go modülleri nasıl çalışır ve Go'da bağımlılık yönetimi nasıldır? Bağımlılıkları güncelleme veya sabitleme sırasında hangi tuzaklar ortaya çıkabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Replace yolları kullanıldığında (<replace github.com/pkg/errors = ../errors>) uyumsuzluk riski vardır.
  • 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.
  • Bazı bağımlılıklar farklı bir sistem (dep, vendoring) kullanır, bu da geçişte zorluklara neden olur.

Tuzaklı Soru

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.

Konuyla ilgili bilinçsizlik nedeniyle gerçek hatalar örnekleri


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".