Modül dersleri (4/5)
Modüllere git
Go modülü, bir veya daha fazla paketten oluşan sürümlendirilebilir bir birimdir. Modern bağımlılık sisteminin temelidir (Go 1.11+): artık GOPATH yok, artık zorunlu vendor yok, açık ve tekrarlanabilir bağımlılıklar.
go.mod: modül bildirimi
module example.com/myapp
go 1.22
require (
github.com/google/uuid v1.6.0
golang.org/x/time v0.5.0
)
Üç ana direktif:
module <path>— modülün içe aktarma yolu. Tüm dahili paketlerexample.com/myapp/sub/pkgolarak içe aktarılır. Gerçek bir URL olması gerekmez, ancakgo getaracılığıyla yayınlamak için çözülmesi gerekir.go <version>— gereken minimum Go sürümü (aynı zamanda hangi dil özelliklerine izin verildiğini kontrol etmek için de kullanılır, örneğin 1.23'teki range-over-func).require— tam sürümleriyle doğrudan bağımlılıklar.
Diğer yönergeler: replace (dep'i çatal veya yerel yolla değiştirir), exclude, retract.
go.sum: kriptografik kilit dosyası
go.mod'nin yanı sıra go.sum indirilen HER sürümün (geçişli bağımlılıklar dahil) kriptografik karmasını içerir. Tekrarlanabilirliği garanti eder: Birisi yayınlanmış bir sürüme müdahale ederse derleme başarısız olur.
Her zaman kesinleştirin. go komutları tarafından otomatik olarak güncellenir.
Temel komutlar
go mod init example.com/myapp # create go.mod
go get github.com/google/uuid # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./... # upgrade every dep
go mod tidy # remove unused deps, add missing ones
go mod download # download everything into the cache
go mod why github.com/x/y # explain why a dep is included
go mod graph # full dependency graphgo mod tidy içe aktarılan her değişiklikten sonra çalıştırdığınız pakettir: go.mod'nın gerçekte kullanılan paketleri tam olarak yansıttığını garanti eder.
Anlamsal İçe Aktarma Sürümü Oluşturma (SIV)
Sürümler SemVer'i takip eder: v1.2.3 = MAJOR.MINOR.PATCH. İşin ilginç kısmı majör v2+:
- Ana
v0vev1→ normal yol:github.com/foo/bar. - Ana
v2veya üstü → yol ana sürümü içerir:github.com/foo/bar/v2.
import "github.com/foo/bar/v2"Bu, aynı kitaplığın hem v1 hem de v2 öğelerini aynı anda içe aktarmanıza olanak tanır (aşamalı geçişler sırasında kullanışlıdır).
Yolları ve dahili paketleri içe aktarın
Modülünüz example.com/myapp ise, utils/ alt klasörü şu şekilde içe aktarılır:
import "example.com/myapp/utils"Yol, yalnızca go.mod'de belirtilen isme bağlıdır, diskteki konuma değil: farklı bir klasördeki aynı kod çalışmaya devam eder.
Çalışma alanı modu (Go 1.18+)
Aynı anda birbirine referans veren birden fazla modül üzerinde çalışmak için (örneğin, bir kitaplık ve onu kullanan bir uygulama):
go work init ./lib ./appBu, go.work oluşturur: go build, yayınlanan sürümü indirmek yerine ./lib yerel sürümünü kullanır. go.work taahhüt etmeyin (bu bir geliştirme ortamıdır).
Egzersizler
Modül example.com/myapp'tir ve bir utils alt klasörü içerir. Tam yolu kullanarak alt paketi ana pakete aktarın.
İpucu göster
İçe aktarma yolu, modül adı (go.mod'dan) artı klasörün göreceli yoludur.
3 denemeden sonra çözüm mevcut
Hem fmt hem de os'u içe aktararak, içe aktarma ( ... ) sözdizimini kullanarak bireysel içe aktarmaları bir içe aktarma grubuna dönüştürün.
3 denemeden sonra çözüm mevcut
Hangi komut artık go.mod'dan içe aktarılmayan bağımlılıkları kaldırır ve eksik olanları ekler?
$ go mod ???