GoLang: Proč nepoužívat GOPATH

V dřívějších verzích Go konfigurace vyžadovala nastavení některých proměnných prostředí. Postupem času byly tyto požadavky odstraněny, ale řada internetových návodů tyto proměnné stále zmiňuje a způsobuje tak zmatek.

Nedávno byla vydána nová funkce nazvaná Go Modules, díky které konečně není nutné používat GOPATH. V tomto příspěvku vysvětlím, co je to GOPATH, proč jsou Go Modules výhodnější a jak nakonfigurovat projekt tak, aby používal Go Modules (což je překvapivě snadné).

GOPATH je proměnná prostředí, která Go řekne, kam má načíst a stáhnout všechny zdrojové soubory, které použije pro kompilaci vašeho projektu. Tento koncept s sebou nese některá neobvyklá omezení, se kterými se u jiných programovacích jazyků nesetkáte:

  • Vyžaduje, abyste své projekty Go psali uvnitř tohoto adresáře, na který ukazuje proměnná GOPATH (standardně ~/go), i když se vaše ostatní projekty nacházejí jinde;
  • Hierarchie adresářů uvnitř adresáře GOPATH musí odrážet URL vašeho projektu. Například pokud je vaše adresa URL github.com/foo/bar, musíte vytvořit adresář $GOPATH/src/github.com , pak uvnitř něj vytvořte nový adresář: foo/ a uvnitř něj nový adresář bar/ . Uvnitř adresáře bar/ byste pak měli umístit svůj skutečný projekt git;
  • Neexistuje žádný vestavěný způsob, jak sledovat verze používaných balíčků.

Nejhorší problém tohoto nastavení je, že je zcela odlišné od toho, na co jsme zvyklí u většiny ostatních programovacích jazyků. Navíc vzhledem k tomu, že GOPATH je proměnná prostředí, vyžaduje, aby uživatelé věděli něco málo o konfiguraci operačního systému, což je zejména pro začátečníky náchylné k chybám.

Proč byste měli používat moduly Go?

Moduly Go nejsou závislé na žádné z výše uvedených závislostí pro nastavení konkrétních proměnných prostředí, ani na požadavcích na umístění projektu do konkrétního adresáře, jako je tomu u GOPATH.

Je také zpětně kompatibilní, bezpečný a snadno použitelný:

  1. Pro migraci existujícího projektu na používání modulů Go vyžaduje jediný příkaz;
  2. ovlivňuje pouze vaše vývojové prostředí (stejně jako GOPATH), takže nijak neovlivní vaše produkční nasazení;
  3. je zpětně kompatibilní s GOPATH, což znamená, že pokud aktualizujete projekt na používání modulů Go a vaši spolupracovníci stále preferují používání GOPATH, mohou to bez problémů udělat.

Dalším důvodem, proč se naučit používat Go Modules, je to, že GOPATH se v budoucnu pravděpodobně přestane široce používat, takže se ho dříve či později budete muset naučit.

Jsou zde však některé výhrady:

Výhrada 1: GoLang verze 1.11 nebo vyšší

Go Modules budou fungovat pouze s GoLangem verze 1.11 nebo vyšší. V době psaní tohoto příspěvku některé linuxové distribuce, včetně Ubuntu, stále používaly GoLang 1.10.

Aktuální verzi nainstalovaného balíčku Go můžete otestovat následujícím příkazem:

go version

Měl by vypsat něco jako:

go version go1.11.2 linux/amd64

Pokud je zobrazená verze nižší než 1.11.x, budete ji muset odinstalovat a podle následujících kroků nainstalovat požadovanou verzi Go. Upozorňujeme také, že níže uvedené pokyny byly určeny pro Ubuntu a odvozené distribuce, pokud používáte nějakou jinou distribuci, budete muset příkazy upravit, aby vám fungovaly.

Nejprve otevřete terminál a poté můžete spustit následující příkazy:

# 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
  • Stáhněte si balíček Go 1.11 (nebo novější) a rozbalte jej:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Nainstalujte jej ručně do adresáře /usr/local:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Poté zavřete terminál, otevřete nový a otestujte, zda je Go ve správné verzi:
    which go, měl by být výstup: /usr/local/go/bin/go
    go version, měl by být výstup: go version go1.11.x linux/amd64 nebo podobně
  • Pokud jste již balíček Go nainstalovali, odstraňte jej:
    sudo apt-get remove --purge --auto-remove golang
  • Ujistěte se, že je váš systém aktuální:
    sudo apt-get update
    sudo apt-get -y upgrade
  • Stáhněte si balíček Go 1.11 a rozbalte jej:
    wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
    sudo tar -xvf go1.11.linux-amd64.tar.gz
  • Nainstalujte jej ručně do adresáře /usr/local:
    sudo mv go /usr/local
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
  • Poté zavřete terminál, otevřete nový a otestujte, zda je Go ve správné verzi:
    which go, měl by být výstup: /usr/local/go/bin/go
    go version, měl by být výstup: go version go1.11.x linux/amd64 nebo podobně

Caveat 2: Vraťte zpět změny v GOPATH a GOROOT

Pokud jste provedli změny výchozích hodnot GOPATH nebo GOROOT, bylo by vhodné tyto změny odstranit. Nejsou nutné a míchání konfigurací GOPATH s moduly Go může způsobit zmatek. Konkrétněji:

  1. Výchozí hodnota pro GOPATH (pokud není nastavena) je ~/go , takže když zmiňuji adresář ~/go, myslím tím výchozí adresář používaný systémem Go. Pokud jste provedli změny v adresáři GOPATH, může být tento adresář někde jinde, proto doporučuji tyto změny vrátit zpět, aby nedošlo k nedorozumění.
  2. Proměnnou prostředí GOROOT byste neměli měnit, protože jsme Go nainstalovali do výchozího adresáře: /usr/local. Pokud jste však tuto proměnnou prostředí změnili, doporučuji vám vrátit tyto změny zpět, abyste se vyhnuli zmatkům.

Caveat 3: Adresář ~/go nemusíte měnit

Jak již bylo zmíněno ~/go je výchozí adresář, kde Go očekává čtení souborů, pokud není nastaveno GOPATH. To však má význam pouze v případě, že plánujete vytvářet své projekty pomocí GOPATH.

Pokud chcete používat moduly Go, nemusíte vytvářet, upravovat nebo dokonce číst adresář ~/go. Pokud ještě neexistuje, bude pro vás vytvořen automaticky, a pokud existuje, neměli byste v něm nic měnit.

Můžete tedy ignorovat všechny kroky výukového programu, které vás žádají o provedení změn v tomto adresáři, protože pravděpodobně odkazují na požadavky GOPATH.

Také pokud máte projekt Go v současné době uvnitř tohoto adresáře a chcete, aby pracoval s moduly Go, měli byste ho přesunout ven, protože starší verze Go by zakázaly go mod uvnitř GOPATH, i kdyby měl soubor go.mod.

Používání modulů Go

Používání modulů Go spočívá v podstatě v použití následujícího příkazu:

go mod init <your_projects_import_path>

Pro vytvoření nového projektu stačí vytvořit nový adresář (kdekoli mimo ~/go/) a pak jej inicializovat jako modul, tedy:

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

Příkaz go mod init vytvoří v adresáři vašeho projektu nový soubor go.mod. Tento soubor bude obsahovat importní cestu vašeho projektu (obvykle adresu URL vašeho repozitáře) a seznam se všemi balíčky, které v tomto projektu právě používáte.

Tento soubor byste neměli upravovat, protože jej automaticky spravuje většina příkazů go, například go run a go get . Po spuštění těchto 3 příkazů jste tedy dokončili konfiguraci tohoto adresáře jako modulu Go.

Pro otestování vytvořte uvnitř tohoto adresáře nový soubor main.go s těmito řádky kódu:

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

Poté jej otestujte pomocí příkazu go run:

go run main.go 

Který by měl podle očekávání vypsat Hello Go Modules.

Ale já už mám projekt, který používá GOPATH, jak přejít?

Postup je podobný:

  1. Přesuňte adresář svého projektu kamkoli mimo ~/go/
  2. Inicializujte jej jako modul Go, např.:
mv ~/go/src/github.com/myGithubName/myProject ~/anywhere_else/
cd ~/anywhere_else/myProject
go mod init github.com/myGithubName/myProject

Poté můžete otestovat, zda vše funguje, pomocí go test ./... nebo go run main.go , oba příkazy automaticky stáhnou své závislosti a aktualizují soubor go.mod.

To je super, takže mám vytvořit moduly, podmoduly a podmoduly? Ne.

Ačkoli je možné vytvořit několik modulů v jednom projektu, je to téměř vždy zbytečné. Pokud chcete podsložku pro uspořádání kódu Go, hledáte balíčky, nikoli moduly. Příkaz go mod init byste měli v každém projektu spustit pouze jednou, ne vícekrát.

Co mám dělat se soubory `go.mod` a `go.sum`?

Stejně jako u NPM package.json a package-lock.json vytváří koncept Go Modules také některé soubory pro sledování všech verzí vašich závislostí, konkrétně soubory go.mod a go.sum.

Žádný z těchto dvou souborů byste neměli upravovat, protože jsou automaticky spravovány některými nástroji go, například go get a go test. Je také dobré je přidat do svých revizí, protože jsou potřebné pro provádění reprodukovatelných sestavení projektu, tj. kompilaci se všemi stejnými verzemi a balíčky, které máte lokálně.

Závěr

Teď byste měli být připraveni používat moduly Go ve svých vlastních projektech. Jejich použití není povinné, ale pokud jste dočetli až sem, pravděpodobně jste si všimli, jak jsou Go Modules ve srovnání s GOPATH mnohem jednodušší a intuitivnější. Existuje také jedna funkce, kterou vám nabídnou pouze Go Modules:

Pokud se chcete o Go Module dozvědět více podrobností, doporučuji přečíst si tento příspěvek, který je kratší, nebo tento, který je delší – oba jsou velmi stručné a přehledné. Také vám vřele doporučuji provést vlastní průzkum, na webu je několik skvělých příspěvků na toto téma. Šťastné kódování!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.