Saya baru memulai dan mengerjakan kode contoh yang ingin saya lokalkan.
Dalam main.go
pernyataan impor asli itu adalah:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Sekarang saya memiliki common
dan routers
mengemas/home/me/go/src/myapp
Jadi saya mengonversi pernyataan impor menjadi:
import (
"log"
"net/http"
"./common"
"./routers"
)
Tetapi ketika saya menjalankan go install myapp
saya mendapatkan kesalahan ini:
can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package
Juga, ketika saya menggunakan common
dan routers
bukannya ./common
dan ./routers
dalam pernyataan impor, saya mendapatkan:
myapp/main.go:7:3: cannot find package "common" in any of:
/usr/local/go/src/common (from $GOROOT)
/home/me/go/src/common (from $GOPATH)
myapp/main.go:8:2: cannot find package "routers" in any of:
/usr/local/go/src/routers (from $GOROOT)
/home/me/go/src/routers (from $GOPATH)
Bagaimana cara memperbaikinya?
Jawaban:
Nah, saya menemukan masalahnya. Pada dasarnya jalan mulai untuk impor adalah
$HOME/go/src
Jadi saya hanya perlu menambahkan
myapp
di depan nama paket, yaitu impornya harus:import ( "log" "net/http" "myapp/common" "myapp/routers" )
sumber
myapp
adalah ide yang buruk, misalnya jika Anda mengubah nama proyek, semua impor akan gagalgo mod init <module_name>
dan kemudian adilimport "<module_name>/<pkg_name>"
.Jika Anda menggunakan Go 1.5 di atas, Anda dapat mencoba menggunakan fitur vending . Ini memungkinkan Anda untuk meletakkan paket lokal Anda di bawah folder vendor dan mengimpornya dengan jalur yang lebih pendek. Dalam kasus Anda, Anda dapat meletakkan folder umum dan router Anda di dalam folder vendor sehingga akan seperti itu
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
dan impor seperti ini
import ( "common" "routers" "routers/middleware" )
Ini akan berhasil karena Go akan mencoba mencari paket Anda mulai dari direktori vendor proyek Anda (jika memiliki setidaknya satu file .go), bukan $ GOPATH / src.
FYI: Anda dapat melakukan lebih banyak dengan vendor, karena fitur ini memungkinkan Anda untuk meletakkan "semua kode dependensi Anda" untuk sebuah paket di dalam direktori proyek Anda sendiri sehingga akan selalu bisa mendapatkan versi dependensi yang sama untuk semua build. Ini seperti npm atau pip di python, tetapi Anda perlu menyalin dependensi Anda secara manual ke proyek Anda, atau jika Anda ingin membuatnya mudah, cobalah untuk mencari govendor oleh Daniel Theophanes
Untuk mempelajari lebih lanjut tentang fitur ini, coba cari di sini
Memahami dan Menggunakan Folder Vendor oleh Daniel Theophanes
Memahami Manajemen Ketergantungan Go oleh Lucas Fernandes da Costa
Saya harap Anda atau orang lain merasa terbantu
sumber
Jalur impor berhubungan dengan variabel Anda
$GOPATH
dan$GOROOT
lingkungan. Misalnya, dengan yang berikut ini$GOPATH
:GOPATH=/home/me/go
Paket terletak di
/home/me/go/src/lib/common
dan/home/me/go/src/lib/routers
diimpor masing-masing sebagai:import ( "lib/common" "lib/routers" )
sumber
go install
mengemas yang menggunakan impor relatif.$GOPATH/src
.Paket lokal adalah masalah yang mengganggu saat bepergian.
Untuk beberapa proyek di perusahaan kami, kami memutuskan untuk tidak menggunakan sub paket sama sekali.
$ glide install
$ go get
$ go install
Semua pekerjaan.
Untuk beberapa proyek kami menggunakan sub paket, dan mengimpor paket lokal dengan jalur lengkap:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Tetapi jika kita melakukan fork pada proyek ini, maka subpaket masih mengacu pada yang asli.
sumber