Apa yang seharusnya menjadi nilai-nilai GOPATH dan GOROOT?

323

Saya mencoba memasang doozer seperti ini:

$ goinstall github.com/ha/doozer

Saya mendapatkan kesalahan ini.

goinstall: os: go/build: package could not be found locally
goinstall: fmt: go/build: package could not be found locally
goinstall: io: go/build: package could not be found locally
goinstall: reflect: go/build: package could not be found locally
goinstall: math: go/build: package could not be found locally
goinstall: rand: go/build: package could not be found locally
goinstall: url: go/build: package could not be found locally
goinstall: net: go/build: package could not be found locally
goinstall: sync: go/build: package could not be found locally
goinstall: runtime: go/build: package could not be found locally
goinstall: strings: go/build: package could not be found locally
goinstall: sort: go/build: package could not be found locally
goinstall: strconv: go/build: package could not be found locally
goinstall: bytes: go/build: package could not be found locally
goinstall: log: go/build: package could not be found locally
goinstall: encoding/binary: go/build: package could not be found locally
jshen
sumber
3
@Motin tautan di atas tidak lagi valid
Jorrit Reedijk
File menjadi usang untuk proyek. Masalah terkait terkait OSX ditemukan di sini: github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/841
Motin
Catatan: secara default, GOPATHakan ditetapkan untuk Anda di Go 1.8 (2017). Lihat jawaban saya di bawah ini
VonC
Ya saya juga menemukan ini membingungkan, cara mengatur godocs. Ini membantu: albertech.blogspot.com/2017/01/...
jar
1
@BenyaminJafari karena goinstallbenar-benar kuno sebelum Go1 dan belum ada sejak 2012.
Dave C

Jawaban:

310

GOPATHdibahas dalam cmd/godokumentasi :

The GOPATHlingkungan daftar variabel tempat untuk mencari kode Go. Pada Unix, nilainya adalah string yang dipisahkan dengan titik dua. Pada Windows, nilainya adalah string yang dipisahkan titik koma. Pada Paket 9, nilainya adalah daftar.

GOPATH harus ditetapkan untuk mendapatkan, membangun, dan menginstal paket di luar pohon Go standar.

GOROOTdibahas dalam instruksi instalasi :

Distribusi biner Go mengasumsikan mereka akan diinstal di /usr/local/go(atau di c:\Gobawah Windows), tetapi dimungkinkan untuk menginstal Go tools ke lokasi yang berbeda. Dalam hal ini Anda harus mengatur GOROOTvariabel lingkungan untuk menunjuk ke direktori tempat itu diinstal.

Misalnya, jika Anda menginstal Pergi ke direktori home Anda, Anda harus menambahkan perintah berikut ke $HOME/.profile:

export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin

Catatan: GOROOT harus ditetapkan hanya ketika menginstal ke lokasi khusus.

(Versi terbaru dari jawaban Chris Bunch .)

Pje
sumber
44
Informasi yang jauh lebih komprehensif tentang GOPATH ada di How to Write Go Code. Pemahaman akan informasi yang diperlukan untuk memahamigo perintah, yang penting untuk bekerja dengan Go. Misalnya penggunaan goinstalldalam OP sekarang seharusnya go get.
Sonia
13
Perhatikan juga jalur pemasangan sebenarnya. Misalnya, dalam pengaturan homebrew default, homebrew akan menginstal masuk /usr/local/Cellar/go/. Dalam hal ini jalur ekspor harus ditetapkan dengan export GOROOT=/usr/local/Cellar/go/{version}dan export PATH=$PATH:$GOROOT/bin.
ekillaby
10
Saya harus melakukan export GOROOT=/usr/local/Cellar/go/1.2/libexec/agar pekerjaan saya dengan minuman.
Steven Soroka
Saya tidak dapat menyarankan hasil edit ini karena aplikasi mengeluh bahwa hasil edit saya “tampaknya mengandung” kode yang tidak diformat (yang tidak; terima kasih banyak SO) tetapi:
Wildcard
Mulai di Go 1.10, jika GOROOT tidak disetel, alat go akan mencoba mengetahuinya berdasarkan lokasinya sendiri. Saya juga tidak bisa menempelkan tautan karena tempel tidak berfungsi di aplikasi iOS Stack Exchange. Sangat frustrasi sekarang.
Wildcard
97

Berikut ini adalah pengaturan sederhana saya:

directory for go related things: ~/programming/go
directory for go compiler/tools: ~/programming/go/go-1.4
directory for go software      : ~/programming/go/packages

GOROOT, GOPATH, PATH diatur sebagai berikut:

export GOROOT=/home/user/programming/go/go-1.4
export GOPATH=/home/user/programming/go/packages
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Jadi, singkatnya:

GOROOT adalah untuk kompiler / alat yang berasal dari instalasi go.
GOPATH adalah untuk proyek proyek Anda sendiri / perpustakaan pihak ke-3 (diunduh dengan "go get").

EvgenijM86
sumber
Saya pikir jawaban ini lebih mudah dimengerti karena ada pemetaan terhadap struktur folder.
h-rai
Apakah GOPATH menyertakan seluruh pohon proyek (misalnya git) dengan file tidak jalan - misalnya gambar, skrip, file bangunan, dll?
Serge Merzliakov
52

Jalankan pertama go env.
Jika Anda melihat bahwa perjalanan tidak diinstal, Anda dapat menginstalnya melalui homebrewatau melalui paket dan / atau cara lain.
Jika Anda melihat output maka AndaGo terinstal.
Ini menunjukkan kepada Anda semua envs yang ditetapkan dan tidak.

Jika Anda melihat kosong untuk GOROOT:

  1. Jalankan which go(Di komputer saya:/usr/local/go/bin/go )
  2. lalu ekspor seperti ini export GOROOT=/usr/local/go

Jika Anda melihat kosong untuk GOPATH:

  1. Buat direktori apa saja di mana saja di komputer Anda untuk proyek yang sedang berjalan dalam kasus saya: ~/GO_PROJECTS
  2. Kemudian export GOPATH=~/GO_PROJECTS
РАВИ
sumber
2
which gomelakukannya untukku. Itu menggunakan lokasi instalasi go lain dari instalasi sebelumnya menggunakan Chocolatey. Menghapus folder itu dan menghapusnya dari variabel PATH. Sekarang berhasil. Terima kasih!
sgarg
which goperintah tidak bekerja untuk saya di Windows 7. Bagaimana cara menemukan di mana saya harus menjalankan perintah ini
firstpostcommenter
Perintah windows yang sesuai adalah where goia akan menunjukkan jalur file yang dieksekusi
Falco
export GOPATH=~/GO_PROJECTSmelakukan pekerjaan
Thamaraiselvam
39

GOPATHdibahas di sini :

The GOPATHEnvironment Variable

GOPATH dapat diatur ke daftar jalur yang dipisahkan oleh titik dua di mana kode Go, objek paket, dan executable dapat ditemukan.

Atur a GOPATHuntuk menggunakan goinstall untuk membangun dan menginstal kode Anda sendiri dan perpustakaan eksternal di luar pohon Go (dan untuk menghindari penulisan Makefiles).

Dan GOROOTdibahas di sini :

$GOROOTAkar pohon Go, sering $HOME/go. Ini default ke induk dari direktori di mana all.bashdijalankan. Jika Anda memilih untuk tidak menyetel $GOROOT, Anda harus menjalankan gomake daripada membuat atau gmake ketika mengembangkan program Go menggunakan makefiles konvensional.

Chris Bunch
sumber
jadi jika saya telah menginstal di ~ / proyek / go, apa yang harus nilai-nilai variabel untuk menemukan os, fmt, dll?
jshen
2
Jadi di mana Go menginstal ketika Anda sudo apt-get install golang?
weberc2
9
@ weberc2 jika Anda menjalankan go envAnda harus melihat informasi itu, bagi saya itu/usr/lib/go/
Andre
19

Saya membaca go help gopathdokumen dan masih sangat bingung, tetapi menemukan nugget kecil ini dari halaman go doc lainnya:

Variabel lingkungan GOPATH menentukan lokasi ruang kerja Anda. Kemungkinan satu-satunya variabel lingkungan yang perlu Anda atur saat mengembangkan kode Go.

http://golang.org/doc/code.html#GOPATH

Maks
sumber
10

GOPATH seharusnya tidak mengarah ke instalasi Go, melainkan ke ruang kerja Anda (lihat https://golang.org/doc/code.html#GOPATH ). Setiap kali Anda menginstal beberapa paket dengan go get atau go install, itu akan mendarat dalam GOPATH. Itulah sebabnya itu memperingatkan Anda, bahwa Anda pasti tidak ingin paket acak dari internet untuk dibuang ke instalasi resmi Anda.

arganzheng
sumber
9

Dimulai dengan go 1.8 (Q2 2017), GOPATH akan ditetapkan untuk Anda secara default ke $ HOME / go

Lihat edisi 17262 dan komentar Rob Pike:

$HOME/goboleh jadi.
Tidak ada satu jawaban terbaik tetapi ini singkat dan manis, dan hanya bisa menjadi masalah untuk memilih nama itu jika $HOME/gosudah ada, yang hanya akan senang untuk para ahli yang sudah menginstal dan akan mengerti GOPATH.

VONC
sumber
Bagaimana suatu topik yang begitu sederhana menjadi begitu rumit! Terima kasih atas jawaban terbaik di sini.
dodgy_coder
@dodgy_coder Sebenarnya ... lihat dua baris pertama dari jawaban saya yang lain: stackoverflow.com/a/37905102/6309 ;) Itu mungkin berakhir lebih sederhana: tidak ada GOPATH sama sekali! Lebih detail di stackoverflow.com/a/48914523/6309 .
VonC
ya saya setuju, GOPATH tidak benar-benar diperlukan jika Anda pergi dengan default, apakah itu benar? Saya tetap harus menyetelnya karena itu diperlukan untuk lingkungan pengembangan Google App Engine (Go Standard). Mereka benar-benar memberitahu Anda untuk mengatur GOPATH, tetapi tidak memberi tahu Anda nilai apa yang ditetapkan untuk ...!
dodgy_coder
@dodgy_coder Ya, secara default, Go akan mencari proyek PATH dalam nilai yang telah ditentukan sebelumnya.
VonC
6

Seperti disebutkan di atas:

Variabel lingkungan GOPATH menentukan lokasi ruang kerja Anda.

Untuk Windows , ini bekerja untuk saya (di jendela Ms-dos):

set GOPATH=D:\my_folder_for_go_code\

Ini menciptakan variabel GOPATH yang diakui oleh Ms-dos saat digunakan sebagai berikut:

cd %GOPATH%
Timothée HENRY
sumber
3

Mengenai GOROOTkhusus, Go 1.9 akan mengaturnya secara otomatis ke jalur instalasinya.
Bahkan jika Anda memiliki beberapa Go yang diinstal, memanggil yang 1.9.x satu akan diatur GOROOTke /path/to/go/1.9(sebelum, jika tidak diatur, itu diasumsikan jalur default suka /usr/local/goatau c:\Go).

Lihat Ulasan CL Go 53370 :

The go toolsekarang akan menggunakan jalur dari mana ia dipanggil untuk mencoba untuk menemukan akar Go install pohon .
Ini berarti bahwa jika seluruh instalasi Go dipindahkan ke lokasi baru, go toolharus terus berfungsi seperti biasa.

Ini mungkin ditimpa dengan pengaturan GOROOTdi lingkungan, yang seharusnya hanya dilakukan dalam keadaan yang tidak biasa.
Perhatikan bahwa ini tidak mempengaruhi hasil runtime.GOROOT()fungsi , yang akan terus melaporkan lokasi instalasi asli; ini mungkin diperbaiki pada rilis selanjutnya.

VONC
sumber
0

Pada tahun 2020 dan Go versi 1.13+, di Windows cara terbaik untuk memperbarui GOPATH adalah dengan mengetikkan command prompt:

setx GOPATH C:\mynewgopath
Farshid
sumber
0

Berikut adalah satu solusi (pengguna tunggal):

GOROOT=$HOME/.local # your go executable is in $GOROOT/bin
GOPATH=$HOME/.gopath
PATH=$GOROOT/bin:$GOPATH/bin:$PATH

gomengeluh jika Anda berubah .gopathmenjadi .go.

Saya berharap mereka pergi dengan bagaimana rust/cargoorang - orang lakukan dan meletakkan semuanya di satu tempat.

pecahan
sumber
-1

di osx, saya instal dengan brew, ini adalah pengaturan yang berfungsi untuk saya

GOPATH="$HOME/my_go_work_space" //make sure you have this folder created

GOROOT="/usr/local/Cellar/go/1.10/libexec"
Edwin Ikechukwu Okonkwo
sumber
-1

Saya harus menambahkan

export GOROOT=/usr/local/Cellar/go/1.10.1/libexec

ke ~ / .bash_profile saya di Mac OS X

Shammi Shailaj
sumber
-1

Ada juga kasus di mana ketika kita menggunakan go, ia mengkompilasi semua file go.

Jadi katakanlah kita memiliki satu file main.go dan kemudian kita mengubah file saat ini menjadi main_old.go dan kemudian menambahkan file main.go baru kita . Lalu ketika kita membangun aplikasi kita semua file go akan dikompilasi. Jadi kesalahan yang terjadi mungkin karena kesalahan kompilasi di beberapa file go lainnya.

Jino Jossy
sumber
-1

Setelah Go lang diinstal, GOROOT adalah direktori root dari instalasi.

Ketika saya meledak binari Go Lang di direktori Windows C: \, GOROOT saya seharusnya menjadi C: \ go. Jika Diinstal dengan penginstal Windows, mungkin C: \ Program Files \ go (atau C: \ Program Files (x86) \ go, untuk paket 64-bit)

 GOROOT = C:\go

sedangkan GOPATH saya adalah lokasi kode sumber atau ruang kerja Go lang.

Jika kode sumber Go lang saya terletak di C: \ Users \\ GO_Workspace, GOPATH Anda akan seperti di bawah ini:

 GOPATH = C:\Users\<xyz>\GO_Workspace
Amit Kaneria
sumber
-1

Anda tidak perlu mengatur secara eksplisit GOROOT (versi Go modern dapat mengetahuinya sendiri berdasarkan lokasi biner go yang Anda jalankan).

Juga, dapatkan kesalahan ikuti ketika mencoba untuk bekerja dengan vgo:

go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

Menghapus GOROOT, memperbarui GOPATH saya dan export GO111MODULE="on" menyelesaikan masalah.

GOPATH lihat di sini

GOPATH dapat diatur ke daftar jalur yang dipisahkan oleh titik dua di mana kode Go, objek paket, dan executable dapat ditemukan.

Tetapkan GOPATH untuk menggunakan goinstall untuk membangun dan menginstal kode Anda sendiri dan perpustakaan eksternal di luar pohon Go (dan untuk menghindari penulisan Makefiles).

Effi Bar-She'an
sumber
-2

nilai harus (MACOS):

GOROOT="/usr/local/go" --> all binaries file core go
GOPATH="/Applications/proyectos/go" --> the route to workspace (custom workspace)
Diego Santa Cruz Mendezú
sumber
-3

Jika Anda menggunakan distro, Anda harus menunjukkan di mana file-file yang disertakan, misalnya:

$ rpm -ql golang | grep include
/usr/lib/golang/include

(Ini untuk Fedora 20)

Breno Leitão
sumber