Salt la conținutul principal
Modulul 9 · Lecția 4 din 544/50 în curs~12 min
Lecții din modul (4/5)

Go module

Un modul Go este o unitate versionabilă alcătuită din unul sau mai multe pachete. Este fundamentul sistemului modern de dependență (Go 1.11+): nu mai sunt GOPATH, nu mai sunt vendor obligatorii, dependențe explicite și reproductibile.

go.mod: manifestul modulului

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

Trei directive principale:

  • module <path> — calea de import a modulului. Toate pachetele interne sunt importate ca example.com/myapp/sub/pkg. Nu trebuie să fie o adresă URL reală, dar pentru a publica prin go get trebuie să se rezolve.
  • go <version> — versiunea Go minimă necesară (utilizată și pentru a controla caracteristicile de limbă permise, de exemplu, range-over-func în 1.23).
  • require — dependențele directe cu versiunea lor exactă.

Alte directive: replace (înlocuiește un dep cu o bifurcătură sau o cale locală), exclude, retract.

go.sum: fișierul de blocare criptografic

Alături de go.mod, go.sum conține un hash criptografic al FIECARE versiune descărcată (inclusiv dependențe tranzitive). Garantează reproductibilitatea: dacă cineva modifică o versiune publicată, construirea eșuează.

Comitați-l întotdeauna. Este actualizat automat prin comenzi go.

Comenzi esențiale

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 este cel pe care îl rulați după fiecare modificare a importurilor: garantează că go.mod reflectă exact pachetele utilizate efectiv.

Versiune de import semantic (SIV)

Versiunile urmează SemVer: v1.2.3 = MAJOR.MINOR.PATCH. Partea interesantă este major v2+:

  • Major v0 și v1 → cale normală: github.com/foo/bar.
  • Major v2 sau mai târziu → calea include versiunea majoră: github.com/foo/bar/v2.
Go
import "github.com/foo/bar/v2"

Aceasta vă permite să importați atât v1 cât și v2 ale aceleiași biblioteci în același timp (util în timpul migrărilor progresive).

Importați căi și pachete interne

Dacă modulul dvs. este example.com/myapp, un subdosar utils/ este importat ca:

Go
import "example.com/myapp/utils"

Calea depinde doar de numele declarat în go.mod, nu de locația de pe disc: același cod dintr-un folder diferit continuă să funcționeze.

Modul spațiu de lucru (Go 1.18+)

Pentru a lucra pe mai multe module care se referă unul la celălalt în același timp (de exemplu, o bibliotecă și o aplicație care o folosește):

Bash
go work init ./lib ./app

Aceasta creează go.work: go build va folosi versiunea locală a ./lib în loc să o descarce pe cea publicată. Nu comite go.work (este un mediu de dezvoltare).

Exerciții

Exercițiu#go.m9.l4.e1
Încercări: 0Se încarcă…

Modulul este example.com/myapp și conține un subdosar utils. Importați sub-pachetul în principal folosind calea completă.

Se încarcă editorul...
Afișează indiciu

Calea de import este numele modulului (de la go.mod) plus calea relativă a folderului.

Soluție disponibilă după 3 încercări

Exercițiu#go.m9.l4.e2
Încercări: 0Se încarcă…

Transformați importurile individuale într-un grup de import cu sintaxa import ( ... ), importând atât fmt, cât și os.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Quiz#go.m9.l4.e3
Gata

Care comandă elimină dependențele care nu mai sunt importate din go.mod și le adaugă pe cele lipsă?

Go
$ go mod ???
Opțiuni de răspuns