Go Modules
Resources;
- https://medium.com/@fonseka.live/getting-started-with-go-modules-b3dac652066d
İngilizce klavyeye geçtiğimden ve bu hainlik yetmez gibi bir de alıştığımdan ötürü türkçe zorlanarak yazdığım ilk yazıya hoşgeldim. Benden başkasının okumadığı inancı ve ümidiyle yazdığım için birinci tekil şahıs kullanmakta sıkıntı görmüyorum. Hoşbuldum bu arada.
Go modules nedir?
(Biraz once tekrar ingilizce klavyeye gectigimi uzulerek belirtiyorum. 3 satir suren kararliligimdan oturu kendimi alkisliyorum.)
Go Modules, versiyon 1.11 ile hayatimiza girmis Go’nun dependency management system’idir. Eskiler, go modules olmadan once hayatin zorluklarla dolu oldugunu soylerler. Derler ki, “bir dependency management tool’umuz olmadigindan oturu ornegin go get ile indirdigimiz bir paket, kendi icinde depend oldugu diger paketlerin de son surumlerini indirirdi. Indirdigimiz paket, depend oldugu paket(ler)in son surumuyle calismadigi durumlarda buyuk sikintilar yasardik. Neyse ki Go Modules sayesinde artik dependencylerin versiyonlarini belirterek sonradan ortaya cikmasi muhtemel uyumsuzluklarin onune gecilmis oldu.”
Evet, amcamizi dinledik. Uzerine fazla bir sey soylemeye gerek yok, bizce her sey cok net.
Hemen bir projeye nasil go modules eklenir onu konusalim.
Bir Go projesine go modules eklemek
Projemizin bulundugu dizine geliyoruz,
go mod init $(pwd)
diyoruz… Simdi bunu dedigimiz anda (aslinda bir kac milisaniye sonra) dizinimizde go.mod isminde bir dosya olustugunu goruyoruz. Dosyayi actigimizda module kelimesi ve yaninda o anki directory’mizin yazdigini goruyoruz. Cok normal cunku go mod init’e parametre olarak pwd’yi verdik.
Go modules kullandigimizda, Go artik GOPATH’i degil go.mod’u baz alir. Yani ornegin go init’i;
go mod init github.com/ermissa/testproje
seklinde calistirirsak go.mod’daki pathimiz bu sekilde set olur fakat buradaki github.com’un $GOPATH/src/github.com’la bir alakasi yoktur. Go modules calistigi directory’i github.com/ermissa/testproje olarak isimlendiriyor seklinde de dusunebiliriz. Ornegin testproje directory’miz icerisinde subdir isimli bir subdirectory olusturalim. Icerisine de subdir.go isimli bir dosya acalim.
Dosyanin basina package subdir yazarak paket ismini subdir yapalim.
Simdi mesela subdir.go icerisindeki bir fonksiyonu ana dizindeki main.go icerisinde kullanmak istiyoruz. Bunun icin subdirectory’i import etmemiz gerekiyor. Bunu nasil yapacagiz? Cok basit,
go.mod’a verdigimiz path’i referans alarak subdirectory’deki paketimizi import ediyoruz. Hatirlarsaniz go.mod’u github.com/ermissa/testproje yolu ile initialize etmistik, o halde main.go’nun basinda
import (
"github.com/ermissa/testproje/subdir"
)
seklinde subdir paketimizi import edebiliriz.
Bahsetmem gereken en onemli meselelerden birisi de go modules’in dependency’ler icin GOPATH’i kullanmiyor olmasi. Yani ornegin go modules kullanarak gelistirdigimiz bir projede github.com’dan import ettigimiz paketler icin $GOPATH/src/github.com’daki paketler kullanilmaz. Peki neredeki paketler kullanilir? Cok guzel bir soru. (Deli gibi kendi kendime konusuyorum ama bir yandan zevkli de)
$GOPATH/pkg/github.com’daki paketler kullanilir. Dikkat ettiyseniz modules kullanmadiginiz zaman paketlerin $GOPATH/src/github.com’den import edildigini soylemistik. Peki neden var bu fark? Guzel soru yine. Gerci guzel diyemeyiz, ilk akla gelen soru neticede. Her neyse nedeni su;
en basta go modules icin ne demistik? dependency management system’dir demistik. (inanmayan yukaridan baksin ama bana guveniyorsaniz bakmaniza gerek yok) Bir dependency management system’in en onemli gorevlerinden birisi nedir? Tabii ki depend olunan paketlerin versiyon kontrollerini yapmasidir. Proje gelistirildigi sirada kullanilan paketlerin o anki versiyonlarini tutup, baska birisi bu projeyi kullanmak istedigi zaman kullanilan paketlerin son versiyonlarini korlemesine indirmemek, tuttugu kayitlara bakip uygun versiyonu indirmek. GOPATH’te bu sekilde bir version check yok, go get’i caktigimiz anda oraya son versiyon iniyor. Go modules ise $GOPATH/pkg/ icerisinde bunlari versiyonlariyla beraber tutuyor. Yani ayni paketin farkli versiyonlarini gormek mumkundur bu directory’de. Boylece bir proje A paketinin v1.0’ini kullanirken bir digeri v1.1’ini sorunsuz kullanabilir.
Peki iyi guzel tamam da, benim gelistirdigim projeyi Nurullah’in bilgisayarina atip build etmek istedigimiz zaman bu modules nereden biliyor hangi versiyonlari indirmesi gerektigini?
Bunu anlamak icin projemizin kok dizininde go build komutunu calistiriyoruz. Bu komuttan sonra go.mod‘a girip baktigimizda required olarak kullandigimiz paketlerin versiyonlariyla beraber eklendigini gorebiliriz. Bu sayede go modules hangi paketin hangi versiyonunu indirecegini bilebilir.
Go modules ile ilgili daha anlatilacak cok sey var. Ornegin init’ten baska diger komutlar ve ne ise yaradiklari. Fakat o da baska bir gunun konusu olsun. Selametle.
Leave a comment