Ana içeriğe geç
Modül 9 · Ders 4 ders 5Kurstaki 44/50~12 min
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

Code
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 paketler example.com/myapp/sub/pkg olarak içe aktarılır. Gerçek bir URL olması gerekmez, ancak go get aracı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

Bash
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 graph

go 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 v0 ve v1 → normal yol: github.com/foo/bar.
  • Ana v2 veya üstü → yol ana sürümü içerir: github.com/foo/bar/v2.
Go
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:

Go
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):

Bash
go work init ./lib ./app

Bu, 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

Egzersiz#go.m9.l4.e1
Denemeler: 0Yükleniyor…

Modül example.com/myapp'tir ve bir utils alt klasörü içerir. Tam yolu kullanarak alt paketi ana pakete aktarın.

Düzenleyici yükleniyor…
İ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

Egzersiz#go.m9.l4.e2
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Quiz#go.m9.l4.e3
Hazır

Hangi komut artık go.mod'dan içe aktarılmayan bağımlılıkları kaldırır ve eksik olanları ekler?

Go
$ go mod ???
Cevap seçenekleri