GoLang: Miksi ei käytetä GOPATHia

Gon aikaisemmissa versioissa sen konfigurointi vaati joidenkin ympäristömuuttujien asettamista. Ajan myötä nämä vaatimukset poistettiin, mutta monet verkko-oppaat mainitsevat edelleen nämä muuttujat aiheuttaen sekaannusta.

Viime aikoina julkaistiin uusi ominaisuus nimeltä Go Modules, joka lopulta tekee GOPATH:n tarpeettomaksi. Tässä postauksessa selitän, mikä on GOPATH, miksi Go Modules on suositeltavampi ja miten projekti konfiguroidaan käyttämään Go Modulesia (mikä on yllättävän helppoa).

GOPATH on ympäristömuuttuja, joka kertoo Go:lle, mistä sen pitäisi lukea ja ladata kaikki lähdetiedostot, joita se käyttää projektin kääntämiseen. Tähän käsitteeseen liittyy joitakin epätavallisia rajoituksia, joita et näe muissa ohjelmointikielissä:

  • Se vaatii sinua kirjoittamaan Go-projektisi tämän GOPATH-muuttujan osoittaman hakemiston (oletusarvoisesti ~/go) sisälle, vaikka muut projektisi sijaitsisivatkin jossain muualla;
  • GOPATH-hakemiston sisällä olevan hakemistohierarkian on heijastettava projektisi URL-osoitetta. Jos URL-osoitteesi on esimerkiksi github.com/foo/bar, sinun on luotava hakemisto $GOPATH/src/github.com , jonka sisälle luot uuden hakemiston: foo/ ja sen sisälle uusi hakemisto bar/ . Sitten hakemiston bar/ sisälle sinun pitäisi laittaa varsinainen git-projektisi;
  • Ei ole mitään sisäänrakennettua tapaa seurata käyttämiesi pakettien versioita.

Pahin ongelma tässä asetelmassa on se, että se on täysin erilainen kuin mihin olemme tottuneet useimmissa muissa ohjelmointikielissä. Lisäksi, koska GOPATH on ympäristömuuttuja, se vaatii käyttäjiltä hieman tietämystä käyttöjärjestelmän konfiguroinnista, mikä on virhealtista varsinkin aloittelijoille.

Miksi sinun pitäisi käyttää Go Modules:ia?

Go Modules ei ole riippuvainen mistään edellä mainituista riippuvuuksista, jotka liittyvät tiettyjen ympäristömuuttujien asettamiseen, eikä myöskään vaatimuksista, jotka edellyttävät projektin sijoittamista tiettyyn hakemistoon kuten GOPATH:n tapauksessa.

Se on myös retroyhteensopiva, turvallinen ja helppokäyttöinen:

  1. Se vaatii vain yhden komennon siirtääksesi olemassa olevan projektin käyttämään Go Modulesia;
  2. Se vaikuttaa vain kehitysympäristöösi (kuten GOPATH), joten se ei vaikuta tuotantokäyttöön millään tavalla;
  3. Se on taannehtivasti yhteensopiva GOPATH:n kanssa, mikä tarkoittaa sitä, että jos päivität projektin käyttämään Go Modulesia ja työtoverisi haluavat silti käyttää mieluummin Go Modulesia, he voivat tehdä sen ongelmitta.

Toinen syy opetella käyttämään Go Modulesia on se, että GOPATH lakkaa todennäköisesti laajalti ottamasta käyttöön tulevaisuudessa, joten sinun on opeteltava se ennemmin tai myöhemmin.

Tässä on kuitenkin joitain varoituksia:

Varoitus 1: GoLang-versio 1.11 tai sitä uudempi

Go-moduulit toimivat vain GoLang-versiolla 1.11 tai sitä uudemmalla. Tätä viestiä kirjoitettaessa jotkut Linux-jakelut, Ubuntu mukaan lukien, käyttivät vielä GoLangia 1.10.

Voit testata asentamasi Go-paketin tämänhetkisen version seuraavalla komennolla:

go version

Sen pitäisi antaa tulosteeksi jotakuinkin näin:

go version go1.11.2 linux/amd64

Jos näkymäsi versio on pienempi kuin 1.11.x, sinun on poistettava Go-paketti ja asennettava sen jälkeen tarvittava Go:n versio alla olevilla ohjeilla. Huomaa myös, että alla olevat ohjeet on tarkoitettu toimimaan Ubuntussa ja siitä johdetuissa distroissa, jos käytät jotain muuta distroa, sinun täytyy mukauttaa komentoja, jotta ne toimisivat sinulle.

Avaa ensin terminaali, jonka jälkeen voit suorittaa seuraavat komennot:

# 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
  • Lataa Go-paketti 1.11 (tai uudempi) ja pura se:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Asenna se manuaalisesti hakemistoosi /usr/local:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Sulje sitten terminaalisi, avaa uusi ja testaa, onko Go oikeassa versiossa:
    which go, pitäisi tulostaa: /usr/local/go/bin/go

    go version, pitäisi tulostaa: go version go1.11.x linux/amd64 tai vastaava

  • Jos olet jo asentanut Go-paketin, poista se:
    sudo apt-get remove --purge --auto-remove golang
  • Varmista, että järjestelmäsi on ajan tasalla:
    sudo apt-get update
    sudo apt-get -y upgrade
  • Lataa Go-paketti 1.11 ja pura se:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Asenna se manuaalisesti hakemistoosi /usr/local:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Sulje sitten terminaalisi, avaa uusi ja testaa, onko Go oikeassa versiossa:
    which go, pitäisi tulostaa: /usr/local/go/bin/go

    go version, pitäisi tulostaa: go version go1.11.x linux/amd64 tai vastaava

Caveat 2: Peruuta muutokset GOPATHiin ja GOROOTiin

Jos olet tehnyt muutoksia GOPATHin tai GOROOTin oletusarvoihin, voi olla viisasta poistaa nämä muutokset. Ne eivät ole tarpeellisia ja GOPATH-konfiguraatioiden sekoittaminen Go-moduuleihin aiheuttaa sekaannusta. Tarkemmin sanottuna:

  1. GOPATH:n oletusarvo (kun sitä ei ole asetettu) on ~/go , joten kun mainitsen hakemiston ~/go tarkoitan Go:n käyttämää oletushakemistoa. Jos olet tehnyt muutoksia GOPATH-hakemistoosi, tämä hakemisto saattaa olla jossain muualla, joten suosittelen, että perut nämä muutokset sekaannusten välttämiseksi.
  2. Sinun ei pitäisi joutua muuttamaan GOROOT-ympäristömuuttujaa, koska olemme asentaneet Go:n oletushakemistoon: /usr/local. Jos olet kuitenkin muuttanut tätä ympäristömuuttujaa, suosittelen peruuttamaan sen sekaannusten välttämiseksi.

Caveat 3: Sinun ei tarvitse muuttaa hakemistoa ~/go

Kuten aiemmin mainittiin, ~/go on oletushakemisto, johon Go odottaa lukevansa tiedostojasi, kun GOPATHia ei ole asetettu. Tällä on kuitenkin merkitystä vain, jos aiot luoda projektisi GOPATH:n avulla.

Jos haluat käyttää Go-moduuleja, sinun ei tarvitse luoda, muokata tai edes lukea hakemistoa ~/go. Jos sitä ei ole vielä olemassa, se luodaan automaattisesti puolestasi, ja jos se on olemassa, sinun ei pitäisi joutua muuttamaan sinne mitään.

Voit siis jättää huomioimatta kaikki tutoriaalin vaiheet, jotka pyytävät sinua tekemään muutoksia tähän hakemistoon, koska ne todennäköisesti viittaavat GOPATH-vaatimuksiin.

Myös, jos sinulla on Go-projekti tällä hetkellä tämän hakemiston sisällä ja haluat sen toimivan Go-moduulien kanssa, sinun pitäisi siirtää se sen ulkopuolelle, koska Go:n vanhemmat versiot poistivat go modin käytöstä GOPATH:n sisällä, vaikka siinä olisi go.mod-tiedosto.

Go-moduulien käyttäminen

Go-moduulien käyttäminen koostuu periaatteessa seuraavan komennon käyttämisestä:

go mod init <your_projects_import_path>

Luodaksesi uuden projektin sinun tarvitsee vain luoda uusi hakemisto (missä tahansa muualla kuin ~/go/) ja sitten alustaa se moduulina, eli:

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

Komento go mod init luo projektisi hakemistoon uuden tiedoston nimeltä go.mod. Tämä tiedosto sisältää projektisi tuontipolun (yleensä reposi URL-osoite) ja luettelon kaikista paketeista, joita käytät tällä hetkellä tässä projektissa.

Tiedostoa ei pitäisi joutua muokkaamaan, koska useimmat go-komennot, kuten go run ja go get, hoitavat sen automaattisesti. Näin ollen näiden kolmen komennon suorittamisen jälkeen olet saanut valmiiksi tämän hakemiston konfiguroinnin Go-moduuliksi.

Testaamiseksi luo uusi main.go-tiedosto tämän hakemiston sisälle näillä koodiriveillä:

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

Testaa sitten sitä go run-komennolla:

go run main.go 

Jonka pitäisi tulostaa odotusarvojen mukaisesti Hello Go Modules.

Mutta mulla on jo hanke, joka käyttää GOPATH:ia, miten voin siirtyä?

Prosessi on samanlainen:

  1. Siirrä projektisi hakemisto jonnekin muualle ~/go/
  2. Initialisoi se Go-moduulina, esim.:
mv ~/go/src/github.com/myGithubName/myProject ~/anywhere_else/
cd ~/anywhere_else/myProject
go mod init github.com/myGithubName/myProject

Sitten voit testata, toimiiko kaikki joko go test ./... tai go run main.go , molemmat komennot lataavat automaattisesti riippuvuutensa ja päivittävät go.mod-tiedoston.

Tämä on siistiä, pitäisikö minun siis luoda moduuleja, alimoduuleja ja alamoduuleja? Ei.

Vaikka on mahdollista luoda useita moduuleja yhteen projektiin, tämä on lähes aina tarpeetonta. Jos haluat alikansion Go-koodin järjestämiseen, etsit paketteja, et moduuleja. Komento go mod init kannattaa ajaa vain kerran projektia kohden, ei enempää.

Mitä teen `go.mod`- ja `go.sum`-tiedostoille?

Kuten NPM:n package.json ja package-lock.json, myös Go Modules -konsepti luo joitain tiedostoja, joiden avulla voit pitää kirjaa riippuvuussuhteidesi kaikista versioista, nimittäin go.mod– ja go.sum-tiedostot.

Sinun ei pitäisi joutua muokkaamaan mitään näistä kahdesta tiedostosta, koska jotkut go-työkalut, kuten go get ja go test, hallinnoivat niitä automaattisesti. On myös hyvä idea lisätä ne kommitointeihisi, koska niitä tarvitaan projektisi toistettavien buildien suorittamiseen, eli kääntämiseen kaikilla samoilla versioilla ja paketeilla, joita sinulla on paikallisesti.

Loppupäätelmä

Sinun pitäisi nyt olla valmis käyttämään Go-moduuleja omissa projekteissasi. Sen käyttäminen ei ole pakollista, mutta jos olet lukenut tähän asti, olet luultavasti huomannut, kuinka paljon helpompaa ja intuitiivisempaa Go Modules on verrattuna GOPATHiin. On myös yksi ominaisuus, jonka vain Go Modules tarjoaa sinulle: Toistettavat buildit.

Jos haluat oppia lisää yksityiskohtia Go Moduleista, suosittelen lukemaan tämän postauksen lyhyemmän version tai tämän pidemmän version, molemmat ovat hyvin tiiviitä ja helppolukuisia. Suosittelen myös tekemään omaa tutkimusta, netissä on useita hyviä postauksia tästä aiheesta. Hyvää koodausta!

Vastaa

Sähköpostiosoitettasi ei julkaista.