Pemasangan gagal dengan kesalahan: tidak ada lokasi pemasangan untuk direktori xxx di luar GOPATH

152
~/src/go-statsd-client> echo $GOPATH
/Users/me/gopath
~/src/go-statsd-client> echo $GOROOT
/usr/local/Cellar/go/1.1.1\
~/src/go-statsd-client> go install
go install: no install location for directory /Users/me/src/go-statsd-client outside GOPATH

Tidak peduli struktur apa proyek ini selalu gagal dengan pesan yang sama. Go build bekerja dengan sempurna.

Ini milik saya go env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/gopath"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.1.1"
GOTOOLDIR="/usr/local/Cellar/go/1.1.1/pkg/tool/darwin_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
CGO_ENABLED="1"

Ini ada di Mac OSX Mountain Lion dan go sudah diinstal dengan homebrew.

tgandrews
sumber

Jawaban:

116

Ketika Anda tidak memberikan argumen go install, default untuk mencoba menginstal paket di direktori saat ini. Pesan kesalahan memberitahu Anda bahwa itu tidak dapat melakukan itu, karena direktori saat ini bukan bagian dari Anda$GOPATH .

Anda dapat:

  • Tentukan $GOPATH$ HOME Anda ( export GOPATH=$HOME).
  • Pindahkan sumber Anda ke dalam saat ini $GOPATH( mv ~/src/go-statsd-client /User/me/gopath).

Setelah itu, masuk ke go-statsd-clientdirektori dan mengetik go installakan berfungsi, dan begitu juga mengetik go install go-statsd-clientdari mana saja di sistem file. Binari binaan akan masuk ke $GOPATH/bin.

Sebagai saran yang tidak terkait, Anda mungkin ingin namespace paket Anda dengan nama domain, untuk menghindari perselisihan nama (misalnya github.com/you/go-statsd-client, jika di situlah Anda memegang kode sumber Anda).

Gustavo Niemeyer
sumber
5
Dalam kasus saya kesalahan ini disebabkan oleh tidak adanya $GOPATH/bindirektori. Membuat folder ini diperlukan - saya tidak perlu mengatur GOBINenv var.
xentek
4
@RobertReiz sementara saya berbagi rasa frustrasi Anda, saya harus menunjukkan bahwa sebagian besar bahasa lain memang menggunakan ini, tapi mungkin mereka tidak terlihat. Misalnya, Python (bahasa yang terkenal karena kesederhanaannya) memiliki PYTHONHOMEalih- alih GOROOTdan PYTHONPATHbukannya GOPATH. Bahkan (GC) C memiliki LIBRARY_PATH, C_INCLUDE_PATH, dll
Hut8
1
Saya mendapatkan kesalahan ini setelah export GOPATH=$PWD(berdiri di akar pohon klon Golang), jawaban Anda tidak mungkin menjelaskan kesalahan dalam kasus ini.
ulidtko
2
Bagi saya, memasukkannya dalam $ GOPATH tidak cukup. Perlu berada di direktori di bawah $ GOPATH / src /
Thomas
9
Saya yakin ada beberapa alasan yang sangat bagus untuk membenarkan keberadaan GOPATH, tetapi dari luar melihat ke dalam, ini tampaknya sama sekali tidak ada artinya. Mengapa saya harus mengubah variabel lingkungan global hanya untuk membuat paket secara lokal 🤔
Alexander
193

Untuk pengguna OS X dan saya di masa depan, Anda juga perlu mengatur GOBINuntuk menghindari pesan yang membingungkan ini saat menginstal dango get

mkdir bin 
export GOBIN=$GOPATH/bin
Benjamin Wootton
sumber
4
Anda seharusnya tidak perlu mengaturGOBIN . Jika mengaturnya untuk $GOPATH/binmembuat perbedaan, maka ada sesuatu yang salah dengan pengaturan Anda atau Anda melakukan sesuatu yang seharusnya tidak Anda lakukan.
Dave C
29
@DaveC Saya juga punya masalah yang sama pada OS X. Mengatur GOBIN memperbaikinya.
nJoshi
2
Terima kasih banyak, sepertinya ada sesuatu dengan paket resmi OS X yang salah memang mengharuskan Anda untuk mengatur GOBIN, masih berlaku untuk 10.11.4 (El Capitan)
Jonas D.
3
Ini adalah perbaikan yang benar untuk Ubuntu 16.04 juga, dengan paket biner dari http://golang.org/dl/
suside
1
Ini bekerja dengan baik pada maOS Sierra 10.12.3 Terima kasih!
Greg Hilston
30

Anda menggunakan go install pada direktori di luar folder GOPATH. Atur variabel env GOBIN Anda, atau pindahkan folder src di dalam GOPATH.

GOPATH/
     bin/
     src/
       go-statsd-client/

Info lebih lanjut: GO BUILD Source code , baris 296

Andrea Di Persio
sumber
Saya mencoba saran di atas (ekspor GOPATH = $ HOME), kemudian pindah ke direktori saya yang relevan (di mana saya menulis kode saya) dan mengetik go install ... hasil sama go install: tidak ada lokasi instalasi untuk direktori ....
stian
Baris 296 hanyalah pernyataan pengembalian?
Felix Rabe
1
Saya lupa mengatur GOBIN env
cevaris
Saya mencari solusi ini.
Mihamina Rakotomandimby
19

Anda perlu mengatur keduanya GOPATHdan GOBIN. Pastikan Anda telah melakukan yang berikut (silakan ganti ~/godengan pilihan Anda GOPATHdan kemudian ubah GOBIN). Ini diuji pada Ubuntu 16.04 LTS.

export GOPATH=~/go 

mkdir ~/go/bin

export GOBIN=$GOPATH/bin

Jawaban yang dipilih tidak memecahkan masalah bagi saya.

Zhenhua
sumber
Saya memiliki keduanya didefinisikan dalam 16.04 dan ini tidak berhasil untuk saya.
Catskul
5

Anda ingin memiliki 3 direktori di dalam direktori GOPATH pilihan Anda.

GOPATH
     /bin
     /src
       /someProgram
        program.go
       /someLibrary
        library.go
     /pkg

Kemudian Anda akan menjalankan go installdari dalam beberapaProgram (yang menempatkan executable di bin) atau someLibrary (yang menempatkan perpustakaan dalam pkg).

Earl Zedd
sumber
1
Ini bekerja untuk saya setelah mencari 2 jam di internet.
vishalknishad
3

Saya punya masalah ini di Windows.

Masalah saya adalah bahwa %GOPATH%variabel lingkungan saya diatur ke

C:\Users\john\src\goworkspace

dari pada

C:\Users\john\src\goworkspace\

Menambahkan garis miring yang hilang di akhir memperbaikinya untuk saya.

eckza
sumber
1
sapi suci Anda baru saja menyelamatkan saya dari sakit kepala berpotensi multi-jam. Saya di Ubuntu tetapi memiliki masalah yang sama. Sangat rajin tentang nama folder, struktur folder, memulai dengan src / github.com / xyabz / dan semuanya tetapi instal terus terus memberi saya kesalahan.
anon58192932
3

Untuk apa nilainya, inilah .bash_profile saya, yang bekerja dengan baik pada saya di mac dengan Atom, setelah menginstal pergi dengan Homebrew:

export GOROOT=`go env GOROOT`
export GOPATH=/Users/yy/Projects/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
JRun
sumber
2

Dalam kasus saya (OS X) itu karena saya telah menetapkan GOPATHke /home/username/go(sesuai buku) daripada/Users/username/go

catamphetamine
sumber
2

Saya di Windows, dan saya mendapatkannya dengan memberikan perintah go help gopathke cmd, dan membaca teks tebal dalam instruksi,

yaitu jika kode Anda wnat untuk menginstal adalah di ..BaseDir...\SomeProject\src\basic\set, yang GOPATH tidak harus lokasi yang sama sebagai kode, harus hanya Basis Proyek DIR: ..BaseDir...\SomeProject.

Variabel lingkungan GOPATH mencantumkan 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.

Jika variabel lingkungan tidak disetel, GOPATH default ke subdirektori bernama "go" di direktori home pengguna ($ HOME / go Unix,% USERPROFILE% \ go di Windows), kecuali jika direktori itu menyimpan distribusi Go. Jalankan "go env GOPATH" untuk melihat GOPATH saat ini.

Lihat https://golang.org/wiki/SettingGOPATH untuk mengatur GOPATH khusus.

Setiap direktori yang tercantum dalam GOPATH harus memiliki struktur yang ditentukan:

Direktori src menampung kode sumber. Jalur di bawah src menentukan jalur impor atau nama yang dapat dieksekusi.

Direktori pkg menyimpan objek paket yang diinstal. Seperti pada pohon Go, setiap sistem operasi target dan pasangan arsitektur memiliki subdirektori pkg sendiri (pkg / GOOS_GOARCH).

Jika DIR adalah direktori yang tercantum dalam GOPATH, sebuah paket dengan sumber di DIR / src / foo / bar dapat diimpor sebagai "foo / bar" dan formulir kompilasi diinstal ke "DIR / pkg / GOOS_GOARCH / foo / bar.a ".

Direktori bin menyimpan perintah yang dikompilasi. Setiap perintah diberi nama untuk direktori sumbernya, tetapi hanya elemen terakhir, bukan seluruh path. Yaitu, perintah dengan sumber di DIR / src / foo / quux diinstal ke DIR / bin / quux, bukan DIR / bin / foo / quux. Awalan "foo /" dilucuti sehingga Anda dapat menambahkan DIR / bin ke PATH Anda untuk mendapatkan perintah yang diinstal. Jika variabel lingkungan GOBIN diatur, perintah dipasang ke direktori yang namanya bukan DIR / bin. GOBIN harus menjadi jalur absolut.

Berikut ini contoh tata letak direktori:

GOPATH=/home/user/go

/home/user/go/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

..........

jika GOPATH telah diatur ke Base Project DIR dan masih memiliki masalah ini, di windows Anda dapat mencoba mengatur GOBIN sebagai Base Project DIR\binatau %GOPATH%\bin.

yu yang Jian
sumber
1

Hati-hati saat berlari

export GOPATH=$HOME

Go menganggap bahwa kode Anda ada di tempat-tempat tertentu yang terkait dengan GOPATH. Jadi, sebagai gantinya, Anda dapat menggunakan buruh pelabuhan untuk menjalankan perintah go:

docker run -it -v $(pwd):/go/src/github.com/<organization name>/<repository name> golang

Dan sekarang Anda dapat menggunakan perintah golang apa pun, misalnya:

go test github.com/<organization name>/<repository name> 
Omer Levi Hevroni
sumber
0

Di windows, jendela cmd saya sudah terbuka ketika saya mengatur variabel lingkungan GOPATH. Pertama saya harus menutup cmd dan kemudian buka kembali agar menjadi efektif.

lapisan
sumber
0

Masalahnya adalah Anda tidak berada di direktori paket yang memiliki file go dengan fungsi utama go dan go install tidak dapat menemukan perintah (file go dengan fungsi utama go) yang ingin Anda instal.

$ cd /path/to/file-with-main-function.go

lalu jalankan:

$ go install 
Margach Chris
sumber
-1

Pada OSX Mojave 10.14, goyang biasanya dipasang di /usr/local/go.

Karenanya, siapkan ENV ini dan Anda harus melakukannya dengan baik.

export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin

Juga, tambahkan ini ke Anda bash_profileatau zsh_profilejika berhasil.

echo "export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin" >> ~/.bash_profile && source ~/.bash_profile

A Null Pointer
sumber