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
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 caexample.com/myapp/sub/pkg. Nu trebuie să fie o adresă URL reală, dar pentru a publica pringo gettrebuie 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
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 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șiv1→ cale normală:github.com/foo/bar. - Major
v2sau mai târziu → calea include versiunea majoră:github.com/foo/bar/v2.
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:
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):
go work init ./lib ./appAceasta 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
Modulul este example.com/myapp și conține un subdosar utils. Importați sub-pachetul în principal folosind calea completă.
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
Transformați importurile individuale într-un grup de import cu sintaxa import ( ... ), importând atât fmt, cât și os.
Soluție disponibilă după 3 încercări
Care comandă elimină dependențele care nu mai sunt importate din go.mod și le adaugă pe cele lipsă?
$ go mod ???