Meskipun saya telah GOPATH
menetapkan dengan benar, saya masih tidak bisa mendapatkan "pergi membangun" atau "jalankan" untuk menemukan paket saya sendiri. Apa yang saya lakukan salah?
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/home/mitchell/go
$ cat ~/main.go
package main
import "foobar"
func main() { }
$ cat /home/mitchell/go/src/foobar.go
package foobar
$ go build main.go
main.go:3:8: import "foobar": cannot find package
$ go help gopath
Jawaban:
Ini tidak berfungsi karena
foobar.go
file sumber Anda tidak ada dalam direktori bernamafoobar
.go build
dango install
mencoba untuk mencocokkan direktori, bukan sumber file.$GOPATH
ke direktori yang valid, misexport GOPATH="$HOME/go"
foobar.go
ke$GOPATH/src/foobar/foobar.go
dan bangunan harus bekerja dengan baik.Langkah-langkah tambahan yang disarankan:
$GOPATH/bin
ke Anda$PATH
oleh:PATH="$GOPATH/bin:$PATH"
main.go
ke subfolder dari$GOPATH/src
, mis$GOPATH/src/test
go install test
seharusnya sekarang membuat executable$GOPATH/bin
yang dapat dipanggil dengan mengetiktest
ke terminal Anda.sumber
GOPATH=/usr/local/go-pkgs
, so Go mencari/usr/local/go-pkgs/src/<package-name>
sumbernya, tetapigo get
memasukkannya ke dalam/usr/local/go-pkgs/src/gopkg.in/<package-name>
. Mengapa saya harus memindahkan secara manual semua paket saya setelah menginstal? Itu konyol.go get
biasanya memasukkan paket ke dalam$GOPATH/src/
jadi jika Anda menyebutnyago get domain.com/path/to/package
akan berakhir pada$GOPATH/src/domain.com/path/to/package
. Saya kira Anda mencoba mengambil paket darigopkg.in
? Jika demikian itulah perilaku absolutly yang dimaksudkan dan Anda harus mengimpornya dengan nama lengkap mereka; misalnyaimport "gopkg.in/yaml.v1"
seperti yang dijelaskan dalam dokumen .Edit: karena Anda berarti GOPATH, lihat fasmat 's jawaban (upvoted)
Seperti disebutkan dalam " Bagaimana cara mencari paket saya? ", Anda perlu meletakkan paket
xxx
di direktorixxx
.Lihat spesifikasi bahasa Go :
The Kode organisasi menyebutkan:
("ruang kerja" adalah entri jalur di Anda
GOPATH
: variabel itu dapat mereferensikan banyak jalur agar 'src, bin, pkg
' Anda menjadi)(Jawaban asli)
Anda juga harus mengatur
GOPATH
untuk ~ / pergi, tidakGOROOT
, seperti yang diilustrasikan dalam " Cara Menulis Kode Pergi ".Itu berbeda dari
GOROOT
:sumber
TL; DR: Ikuti konvensi Go! (pelajaran dipelajari dengan cara yang sulit), periksa versi lama dan hapus . Instal terbaru.
Bagi saya solusinya berbeda. Saya bekerja di server Linux bersama dan setelah memverifikasi
GOPATH
beberapa variabel lingkungan saya dan lainnya beberapa kali masih tidak berfungsi. Saya mengalami beberapa kesalahan termasuk 'Tidak dapat menemukan paket' dan 'jalur impor tidak dikenal'. Setelah mencoba menginstal ulang dengan solusi ini dengan instruksi pada golang.org (termasuk bagian uninstall ) masih mengalami masalah.Butuh beberapa waktu untuk menyadari bahwa masih ada versi lama yang belum dihapus (berjalan
go version
sekaliwhich go
lagi ... DAHH) yang membuat saya ke pertanyaan ini dan akhirnya diselesaikan.sumber
Meskipun jawaban yang diterima masih benar tentang perlunya mencocokkan direktori dengan nama paket, Anda benar-benar perlu bermigrasi untuk menggunakan modul Go alih-alih menggunakan GOPATH. Pengguna baru yang mengalami masalah ini mungkin bingung tentang sebutan untuk menggunakan GOPATH (seperti dulu), yang sekarang sudah ketinggalan zaman. Jadi, saya akan mencoba untuk mengatasi masalah ini dan memberikan panduan yang terkait dengan mencegah masalah ini saat menggunakan modul Go.
Jika Anda sudah terbiasa dengan modul Go dan mengalami masalah ini, lewati ke bagian yang lebih spesifik di bawah ini yang mencakup beberapa konvensi Go yang mudah diabaikan atau dilupakan.
Panduan ini mengajarkan tentang modul Go: https://golang.org/doc/code.html
Organisasi proyek dengan modul Go
Setelah Anda bermigrasi ke modul Go, seperti yang disebutkan dalam artikel itu, atur kode proyek seperti yang dijelaskan:
Anda dapat menginisialisasi modul Anda seperti ini:
Kode Anda tidak perlu berada di github.com untuk membuatnya. Namun, ini adalah praktik terbaik untuk menyusun modul-modul Anda seolah-olah modul-modul itu pada akhirnya akan diterbitkan.
Memahami apa yang terjadi ketika mencoba untuk mendapatkan paket
Ada artikel bagus di sini yang membahas tentang apa yang terjadi ketika Anda mencoba untuk mendapatkan paket atau modul: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 Ini membahas di mana paket disimpan dan akan membantu Anda memahami mengapa Anda mungkin mendapatkan kesalahan ini jika Anda sudah menggunakan modul Go.
Pastikan fungsi yang diimpor telah diekspor
Perhatikan bahwa jika Anda mengalami kesulitan mengakses suatu fungsi dari file lain, Anda perlu memastikan bahwa Anda telah mengekspor fungsi Anda. Seperti dijelaskan dalam tautan pertama yang saya berikan, fungsi harus dimulai dengan huruf besar yang akan diekspor dan tersedia untuk diimpor ke paket lain.
Nama direktori
Detail penting lainnya (seperti yang disebutkan dalam jawaban yang diterima) adalah bahwa nama direktori adalah apa yang menentukan nama paket Anda. (Nama paket Anda harus mencocokkan nama direktori mereka.) Anda dapat melihat contoh ini di sini: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc Dengan yang mengatakan, file yang berisi
main
metode Anda (yaitu, titik masuk aplikasi Anda) agak dikecualikan dari persyaratan ini.Sebagai contoh, saya mengalami masalah dengan impor saya saat menggunakan struktur seperti ini:
Saya tidak dapat mengimpor kode
utils
ke dalammain
paket saya .Namun, begitu saya menempatkan
main.go
subdirektori sendiri, seperti yang ditunjukkan di bawah ini, impor saya bekerja dengan baik:Dalam contoh itu, file go.mod saya terlihat seperti ini:
Ketika saya menyimpan main.go setelah menambahkan referensi
utils.MyFunction()
, IDE saya secara otomatis menarik referensi ke paket saya seperti ini:(Saya menggunakan VS Code dengan ekstensi Golang.)
Perhatikan bahwa jalur impor menyertakan subdirektori ke paket.
Berurusan dengan repo pribadi
Jika kode tersebut merupakan bagian dari repo pribadi, Anda perlu menjalankan perintah git untuk mengaktifkan akses. Jika tidak, Anda dapat menemukan kesalahan lain. Artikel ini menyebutkan cara melakukan itu untuk repositori pribadi Github, BitBucket, dan GitLab: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4 Masalah ini juga dibahas di sini: Apa cara yang tepat untuk "mendapatkan" repositori pribadi?
sumber
Apakah Anda mencoba menambahkan direktori mutlak pergi ke 'jalan' Anda?
sumber