GoLang: De ce să nu folosim GOPATH

În versiunile anterioare ale lui Go, configurarea lui Go necesita configurarea unor variabile de mediu. Cu timpul, aceste cerințe au fost eliminate, dar o mulțime de tutoriale online încă menționează aceste variabile provocând confuzie.

Recent a fost lansată o nouă caracteristică numită Go Modules care în sfârșit face ca GOPATH să nu mai fie necesar. În această postare, voi explica ce este GOPATH, de ce sunt preferate Modulele Go și cum să configurați un proiect pentru a folosi Modulele Go (ceea ce este surprinzător de ușor).

GOPATH este o variabilă de mediu care îi va spune lui Go unde ar trebui să citească și să descarce toate fișierele sursă pe care le va folosi pentru compilarea proiectului dumneavoastră. Acest concept vine cu câteva restricții neobișnuite pe care nu le vedeți la alte limbaje de programare:

  • Vă cere să vă scrieți proiectele Go în interiorul acestui director indicat de variabila GOPATH (în mod implicit ~/go), chiar dacă celelalte proiecte ale dumneavoastră locuiesc în altă parte;
  • Hierarhia directoarelor din interiorul directorului GOPATH trebuie să reflecte URL-ul proiectului dumneavoastră. De exemplu, dacă URL-ul dvs. este github.com/foo/bar, trebuie să creați un director $GOPATH/src/github.com , apoi, să creați un nou director în interiorul acestuia: foo/ și în interiorul acestuia un nou director bar/ . Apoi, în interiorul directorului bar/ ar trebui să vă puneți proiectul git propriu-zis;
  • Nu există o modalitate integrată de a ține evidența versiunilor pachetelor pe care le folosiți.

Cea mai gravă problemă cu această configurație este că este complet diferită de ceea ce suntem obișnuiți în majoritatea celorlalte limbaje de programare. De asemenea, din moment ce GOPATH este o variabilă de mediu, necesită ca utilizatorii să știe câte ceva despre configurarea sistemului de operare, ceea ce este predispus la erori, în special pentru începători.

De ce ar trebui să folosiți Go Modules?

Go Modules nu depinde de niciuna dintre dependențele menționate mai sus pentru configurarea variabilelor de mediu specifice, nici de cerințele de a vă plasa proiectul într-un anumit director, așa cum se întâmplă cu GOPATH.

Este, de asemenea, retrocompatibil, sigur și ușor de utilizat:

  1. Este nevoie de o singură comandă pentru a migra un proiect existent pentru a utiliza Go Modules;
  2. Afectează doar mediul de dezvoltare (ca și GOPATH), astfel încât nu va afecta în niciun fel implementarea în producție;
  3. Este retrocompatibil cu GOPATH, ceea ce înseamnă că dacă actualizați un proiect pentru a utiliza Go Modules și colegii dvs. preferă în continuare să utilizeze GOPATH, o pot face fără probleme.

Un alt motiv pentru a învăța cum să folosiți Go Modules este că GOPATH va înceta probabil să mai fie adoptat pe scară largă în viitor, așa că va trebui să-l învățați mai devreme sau mai târziu.

Există, totuși, câteva avertismente:

Caveat 1: GoLang versiunea 1.11 sau mai mare

Go Modules va funcționa numai cu GoLang versiunea 1.11 sau mai mare. La momentul scrierii acestei postări, unele distribuții Linux, inclusiv Ubuntu, încă foloseau GoLang 1.10.

Puteți testa versiunea curentă a pachetului Go instalat cu următoarea comandă:

go version

Ar trebui să iasă ceva de genul:

go version go1.11.2 linux/amd64

Dacă versiunea pe care o vedeți este sub 1.11.x va trebui să o dezinstalați și să urmați pașii de mai jos pentru a instala versiunea Go necesară. De asemenea, rețineți că instrucțiunile de mai jos au fost concepute pentru a funcționa pe Ubuntu și distribuțiile derivate, dacă folosiți o altă distribuție va trebui să adaptați comenzile pentru ca acestea să funcționeze în cazul dumneavoastră.

În primul rând, deschideți un terminal apoi puteți rula următoarele comenzi:

# If you have already installed the Go package remove it:
sudo apt-get remove --purge --auto-remove golang# Make sure your system is up-to-date:
sudo apt-get update
sudo apt-get -y upgrade# Download the Go 1.11 package and extract it:
wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
sudo tar -xvf go1.11.linux-amd64.tar.gz# Install it manually on your /usr/local directory:
sudo mv go /usr/local
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc# Then close your terminal, open a new one and test if Go is at the correct version:
which go # should output: /usr/local/go/bin/go
go version # should output: go version go1.11.x linux/amd64 or similar
  • Descărcați pachetul Go 1.11 (sau mai nou) și extrageți-l:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Instalați-l manual în directorul /usr/local:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Închideți apoi terminalul, deschideți unul nou și testați dacă Go este la versiunea corectă:
    which go, ar trebui să iasă: /usr/local/go/bin/go

    go version, ar trebui să iasă: go version go1.11.x linux/amd64 sau similar

  • Dacă ați instalat deja pachetul Go, eliminați-l:
    sudo apt-get remove --purge --auto-remove golang
  • Asigurați-vă că sistemul dvs. este actualizat:
    sudo apt-get update
    sudo apt-get -y upgrade
  • Descărcați pachetul Go 1.11 și extrageți-l:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Instalați-l manual în directorul dvs. /usr/local:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Închideți apoi terminalul, deschideți unul nou și testați dacă Go este la versiunea corectă:
    which go, ar trebui să iasă: /usr/local/go/bin/go

    go version, ar trebui să iasă: go version go1.11.x linux/amd64 sau similar

Caveat 2: Anulați modificările la GOPATH și GOROOT

Dacă ați făcut modificări la valorile implicite ale GOPATH sau GOROOT, ar fi înțelept să eliminați aceste modificări. Ele nu sunt necesare și amestecarea configurațiilor GOPATH cu modulele Go este o modalitate de a provoca confuzie. Mai exact:

  1. Valoarea implicită pentru GOPATH (atunci când nu este setată) este ~/go , deci atunci când menționez directorul ~/go mă refer la directorul implicit folosit de Go. Dacă ați făcut modificări în GOPATH, acest director ar putea fi în altă parte, deci, vă sugerez să anulați aceste modificări pentru a evita confuziile.
  2. Nu ar trebui să fie nevoie să modificați variabila de mediu GOROOT, deoarece am instalat Go în directorul implicit: /usr/local. Dacă, totuși, ați modificat această variabilă de mediu, vă sugerez să anulați aceste modificări pentru a evita confuziile.

Cavea 3: Nu trebuie să modificați directorul ~/go

După cum am menționat anterior, ~/go este directorul implicit în care Go se așteaptă să citească fișierele dvs. atunci când GOPATH nu este setat. Cu toate acestea, acest lucru face o diferență doar dacă intenționați să vă creați proiectele folosind GOPATH.

Dacă doriți să folosiți Go Modules, nu trebuie să creați, să modificați sau chiar să citiți directorul ~/go. Dacă nu există încă, acesta va fi creat automat pentru dumneavoastră, iar dacă există, nu ar trebui să fie nevoie să modificați nimic acolo.

Așa că puteți ignora orice pas din tutorial care vă cere să faceți modificări în acest director, deoarece probabil se referă la cerințele GOPATH.

De asemenea, dacă aveți un proiect Go în prezent în interiorul acestui director și doriți ca acesta să funcționeze cu modulele Go, ar trebui să îl mutați în afara acestuia deoarece versiunile mai vechi de Go ar dezactiva go mod în interiorul GOPATH chiar dacă ar avea un fișier go.mod.

Utilizarea modulelor Go

Utilizarea modulelor Go constă practic în utilizarea următoarei comenzi:

go mod init <your_projects_import_path>

Pentru a crea un nou proiect trebuie doar să creați un nou director (oriunde în afara ~/go/) și apoi să îl inițializați ca un modul, adică:

mkdir myProject/
cd myProject
go mod init github.com/myGithubName/myProject

Comanda go mod init va crea un nou fișier numit go.mod în directorul proiectului dumneavoastră. Acest fișier va conține calea de import a proiectului dvs. (de obicei, URL-ul repo-ului dvs.) și o listă cu toate pachetele pe care le utilizați în prezent în acest proiect.

Nu ar trebui să fie nevoie să editați acest fișier, deoarece este gestionat automat de majoritatea comenzilor go, cum ar fi go run și go get . Astfel, după rularea acestor 3 comenzi ați terminat de configurat acest director ca un modul Go.

Pentru a-l testa, creați un nou fișier main.go în interiorul acestui director cu aceste linii de cod:

package mainimport "fmt"func main() {
fmt.Println("Hello Go Modules")
}

Apoi testați-l folosind comanda go run:

go run main.go 

Care ar trebui să dea ca rezultat Hello Go Modules așa cum era de așteptat.

Dar am deja un proiect care folosește GOPATH, cum să migrez?

Procesul este similar:

  1. Mutați directorul proiectului dvs. oriunde în afara ~/go/
  2. Inițializați-l ca un modul Go, de ex.:
mv ~/go/src/github.com/myGithubName/myProject ~/anywhere_else/
cd ~/anywhere_else/myProject
go mod init github.com/myGithubName/myProject

Apoi puteți testa dacă totul funcționează fie cu go test ./..., fie cu go run main.go , ambele comenzi vor descărca automat dependențele lor și vor actualiza fișierul go.mod.

Este grozav, deci ar trebui să creez module, submodule și sub-submodule? Nope.

Deși este posibil să creați mai multe module într-un singur proiect, acest lucru este aproape întotdeauna inutil. Dacă doriți un subfolder pentru a vă organiza codul Go, căutați pachete, nu module. Ar trebui să executați comanda go mod init o singură dată pe proiect, nu mai mult.

Ce ar trebui să fac cu fișierele `go.mod` și `go.sum`?

Ca și în cazul NPM-urilor package.json și package-lock.json, conceptul Go Modules creează, de asemenea, câteva fișiere pentru a ține evidența tuturor versiunilor dependențelor dumneavoastră, și anume fișierele go.mod și .

Nu ar trebui să fie nevoie să editați niciunul dintre aceste 2 fișiere, deoarece acestea sunt gestionate automat de unele instrumente go, cum ar fi go get și go test. De asemenea, este o idee bună să le adăugați la commits, deoarece sunt necesare pentru a realiza compilări reproductibile ale proiectului dumneavoastră, adică pentru a compila cu aceleași versiuni și pachete pe care le aveți la nivel local.

Concluzie

Ar trebui să fiți acum gata să folosiți modulele Go în propriile proiecte. Utilizarea lui nu este obligatorie, dar dacă ați citit până aici probabil ați observat cât de mult mai ușor și mai intuitiv este Go Modules în comparație cu GOPATH. Există, de asemenea, o caracteristică pe care numai Go Modules v-o va oferi: Reproducible builds.

Dacă doriți să aflați mai multe detalii despre Go Modules vă sugerez să citiți această postare pentru o versiune mai scurtă sau aceasta pentru una mai lungă, ambele sunt foarte concise și ușor de citit. Vă recomand, de asemenea, să vă faceți propria cercetare, există mai multe postări foarte bune despre acest subiect pe web. Codare fericită!

Lasă un răspuns

Adresa ta de email nu va fi publicată.