GoLang: Miért nem használjuk a GOPATH-ot

A Go korábbi verzióiban a konfiguráláshoz néhány környezeti változót kellett beállítani. Idővel ezek a követelmények megszűntek, de sok online oktatóanyag még mindig megemlíti ezeket a változókat, ami zavart okoz.

A közelmúltban megjelent egy új funkció, a Go Modules, ami végre szükségtelenné teszi a GOPATH-ot. Ebben a bejegyzésben elmagyarázom, mi az a GOPATH, miért előnyösebb a Go Modules, és hogyan konfiguráljuk a projektet a Go Modules használatára (ami meglepően egyszerű).

A GOPATH egy olyan környezeti változó, amely megmondja a Go számára, hogy honnan olvassa és töltse le az összes forrásfájlt, amelyet a projekt lefordításához használni fog. Ez a koncepció néhány szokatlan korlátozással jár, amelyekkel más programozási nyelveknél nem találkozunk:

  • Ez megköveteli, hogy a Go projekteket ebbe a GOPATH változó által mutatott könyvtárba (alapértelmezés szerint ~/go) írjuk, még akkor is, ha a többi projektünk máshol található;
  • A GOPATH könyvtáron belüli könyvtárhierarchiának tükröznie kell a projekt URL-jét. Például, ha az URL címe github.com/foo/bar, akkor létre kell hoznia egy $GOPATH/src/github.com könyvtárat, majd ezen belül egy új könyvtárat: foo/ és azon belül egy új bar/ könyvtárat. Ezután a bar/ könyvtáron belül kell elhelyezned a tényleges git projektedet;
  • Nincs beépített módja annak, hogy nyomon kövessük a használt csomagok verzióit.

A legnagyobb probléma ezzel a beállítással az, hogy teljesen eltér attól, amit a legtöbb más programozási nyelven megszoktunk. Továbbá, mivel a GOPATH egy környezeti változó, a felhasználónak tudnia kell egy kicsit az operációs rendszer beállításáról, ami különösen a kezdők számára hibalehetőséget jelent.

Miért érdemes a Go Modules-t használni?

A Go Modules nem függ a fent említett függőségektől a konkrét környezeti változók beállításához, sem a követelményektől, hogy a projektedet egy adott könyvtárba helyezd, mint a GOPATH esetében.

Ez ráadásul retro-kompatibilis, biztonságos és könnyen használható:

  1. Egyetlen parancsot igényel egy meglévő projekt áttelepítéséhez a Go Modules használatára;
  2. Ez csak a fejlesztői környezetedre van hatással (ahogy a GOPATH is), így semmilyen módon nem befolyásolja a termelési telepítést;
  3. Visszamenőlegesen kompatibilis a GOPATH-val, ami azt jelenti, hogy ha frissítesz egy projektet a Go Modules használatára, és a munkatársaid továbbra is a GOPATH használatát preferálják, akkor ezt minden probléma nélkül megtehetik.

Egy másik ok, amiért érdemes megtanulni a Go Modules használatát, hogy a GOPATH valószínűleg a jövőben már nem lesz széles körben elterjedt, így előbb-utóbb meg kell majd tanulnod.

Van azonban néhány kikötés:

Caveat 1: GoLang 1.11 vagy magasabb verzió

A Go Modules csak a GoLang 1.11 vagy magasabb verziójával működik. A bejegyzés írásakor néhány Linux disztribúció, köztük az Ubuntu is, még a 1.10 GoLangot használta.

A telepített Go csomag aktuális verzióját a következő paranccsal tesztelheti:

go version

A parancsnak valami ilyesmit kell kiadnia:

go version go1.11.2 linux/amd64

Ha a megjelenő verzió 1.11.x alatt van, akkor azt el kell távolítania, és az alábbi lépéseket követve telepítenie kell a szükséges Go verziót. Azt is vegye figyelembe, hogy az alábbi utasításokat Ubuntu és származékos disztribúciókra szánták, ha más disztribúciót használ, akkor a parancsokat át kell alakítania, hogy működjenek az Ön esetében.

Először nyisson egy terminált, majd futtassa a következő parancsokat:

# 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
  • Töltse le a Go 1.11 csomagot (vagy újabbat) és csomagolja ki:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Telepítse kézzel a /usr/local könyvtárába:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Ezután zárd be a terminálodat, nyiss egy újat, és teszteld, hogy a Go a megfelelő verziónál van-e:
    which go, ki kell adnod:
    which go: /usr/local/go/bin/go

    go version, ki kell adnia: go version go1.11.x linux/amd64 vagy hasonló

  • Ha már telepítetted a Go csomagot, távolítsd el:
    sudo apt-get remove --purge --auto-remove golang
  • Vigyázz, hogy a rendszered naprakész legyen:
    sudo apt-get update
    sudo apt-get -y upgrade
  • Töltsd le a Go 1.11 csomagot és csomagold ki:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Telepítsd kézzel a /usr/local könyvtáradba:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Ezután zárd be a terminálodat, nyiss egy újat, és teszteld, hogy a Go a megfelelő verzióban van-e:
    which go, ki kell adnod: /usr/local/go/bin/go

    go version, ki kell adnia: go version go1.11.x linux/amd64 vagy hasonló

Caveat 2: A GOPATH és a GOROOT módosításainak visszavonása

Ha megváltoztattad a GOPATH vagy a GOROOT alapértelmezett értékeit, érdemes lehet ezeket a módosításokat eltávolítani. Nincs rájuk szükség, és a GOPATH konfigurációk és a Go modulok keveredése zavart okozhat. Pontosabban:

  1. A GOPATH alapértelmezett értéke (ha nincs beállítva) ~/go , tehát amikor a ~/go könyvtárat említem, akkor a Go által használt alapértelmezett könyvtárra gondolok. Ha változtatásokat végeztél a GOPATH-odon, akkor ez a könyvtár máshol lehet, ezért a félreértések elkerülése végett javaslom, hogy ezeket a változtatásokat vond vissza.
  2. A GOROOT környezeti változót nem kell megváltoztatnod, mivel a Go-t az alapértelmezett könyvtárba telepítettük: /usr/local. Ha azonban megváltoztattad ezt a környezeti változót, javaslom, hogy a zavar elkerülése végett vond vissza.

Caveat 3: Nem kell módosítanod a ~/go könyvtárat

Mint már említettük, a ~/go az az alapértelmezett könyvtár, ahová a Go elvárja, hogy olvassa a fájljaidat, ha a GOPATH nincs beállítva. Ez azonban csak akkor jelent különbséget, ha a GOPATH használatával tervezed létrehozni a projektjeidet.

Ha Go modulokat akarsz használni, nem kell létrehoznod, szerkesztened vagy akár olvasnod a ~/go könyvtárat. Ha még nem létezik, akkor automatikusan létrejön neked, és ha létezik, akkor nem kell semmit sem változtatnod benne.

Szóval figyelmen kívül hagyhatsz minden olyan oktatói lépést, amely arra kér, hogy változtass ezen a könyvtáron, mivel ezek valószínűleg a GOPATH követelményeire utalnak.

Szintén, ha van egy Go projekted jelenleg ebben a könyvtárban, és azt akarod, hogy működjön a Go modulokkal, akkor ki kell mozgatnod, mivel a Go régebbi verziói letiltották a go mod-ot a GOPATH-on belül, még akkor is, ha volt egy go.mod fájl.

A Go modulok használata

A Go modulok használata alapvetően a következő parancs használatából áll:

go mod init <your_projects_import_path>

Új projekt létrehozásához csak egy új könyvtárat kell létrehozni (bárhol a ~/go/-n kívül), majd inicializálni modulként, azaz:

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

A go mod init parancs létrehoz egy új go.mod nevű fájlt a projekt könyvtárában. Ez a fájl tartalmazza a projekted importálási útvonalát (általában a repód URL-jét) és egy listát a projektben jelenleg használt összes csomaggal.

Nem kell szerkesztened ezt a fájlt, mivel azt a legtöbb go parancs, például a go run és go get automatikusan kezeli. Így e 3 parancs futtatása után befejezte ennek a könyvtárnak a Go Modulként való konfigurálását.

A teszteléshez hozzon létre egy új main.go fájlt ebben a könyvtárban a következő kódsorokkal:

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

Aztán tesztelje a go run paranccsal:

go run main.go 

Amelynek a Hello Go Modules értéket kell kiadnia a vártnak megfelelően.

De már van egy GOPATH-ot használó projektem, hogyan lehet átállítani?

A folyamat hasonló:

  1. Helyezd át a projekted könyvtárát bárhová a ~/go/
  2. Nyitványozd be Go modulként, pl.:
mv ~/go/src/github.com/myGithubName/myProject ~/anywhere_else/
cd ~/anywhere_else/myProject
go mod init github.com/myGithubName/myProject

Aztán tesztelheted, hogy minden működik-e a go test ./... vagy a go run main.go paranccsal , mindkét parancs automatikusan letölti a függőségeit és frissíti a go.mod fájlt.

Ez király, akkor hozzak létre modulokat, almodulokat és al-almodulokat? Nem.

Bár lehetséges több modult is létrehozni egy projektben, ez szinte mindig szükségtelen. Ha egy almappát akarsz a Go kódod rendszerezésére, akkor csomagokat keresel, nem modulokat. A go mod init parancsot projektenként csak egyszer szabad futtatni, nem többször.

Mit csináljak a `go.mod` és `go.sum` fájlokkal?

Az NPM package.json és package-lock.json fájljaihoz hasonlóan a Go Modules koncepció is létrehoz néhány fájlt a függőségek összes verziójának nyilvántartására, nevezetesen a go.mod és a go.sum fájlokat.

Ezek közül a 2 fájl közül egyiket sem kell szerkesztened, mivel ezeket néhány go eszköz automatikusan kezeli, mint például a go get és a go test. Az is jó ötlet, ha hozzáadod őket a commitjaidhoz, mivel ezek szükségesek a projekted reprodukálható buildjeinek elvégzéséhez, vagyis ahhoz, hogy ugyanazokkal a verziókkal és csomagokkal fordítsd le őket, mint amikkel lokálisan rendelkezel.

Következtetés

Most már készen kell állnod arra, hogy Go modulokat használj a saját projektjeidben. Használata nem kötelező, de ha eddig elolvastad, akkor valószínűleg észrevetted, hogy a Go Modules mennyivel egyszerűbb és intuitívabb a GOPATH-hoz képest. Van egy olyan funkció is, amit csak a Go Modules kínál neked: Reprodukálható buildek.

Ha további részleteket szeretnél megtudni a Go Modules-ről, javaslom, hogy olvasd el ezt a bejegyzést egy rövidebb vagy ezt egy hosszabb verzióért, mindkettő nagyon tömör és könnyen olvasható. Azt is nagyon ajánlom, hogy végezd el a saját kutatásodat, számos nagyszerű poszt található a témáról a weben. Boldog kódolást!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.