Jestem nowy i pracuję nad przykładowym kodem, który chcę zlokalizować.
W oryginalnym main.go
oświadczeniu importowym było to:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Teraz mam common
i routers
pakuję/home/me/go/src/myapp
Więc przekonwertowałem instrukcję import na:
import (
"log"
"net/http"
"./common"
"./routers"
)
Ale kiedy uruchamiam go install myapp
, otrzymuję te błędy:
can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package
Ponadto, kiedy używam common
i routers
zamiast ./common
iw ./routers
instrukcji import, otrzymuję:
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)
Jak mogę to naprawić?
Odpowiedzi:
Cóż, odkryłem problem. Zasadniczo ścieżka początkowa Go do importu to
$HOME/go/src
Musiałem więc tylko dodać
myapp
przed nazwami pakietów, czyli import powinien wyglądać następująco:import ( "log" "net/http" "myapp/common" "myapp/routers" )
źródło
myapp
jest złym pomysłem, na przykład jeśli zmienisz nazwę projektu, cały import się nie powiedziego mod init <module_name>
a potem po prostuimport "<module_name>/<pkg_name>"
.Jeśli używasz wersji Go 1.5 powyżej, możesz spróbować użyć funkcji sprzedawcy . Pozwala umieścić pakiet lokalny w folderze dostawcy i zaimportować go z krótszą ścieżką. W twoim przypadku możesz umieścić folder wspólny i routery w folderze dostawcy, tak aby tak było
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
i zaimportuj go w ten sposób
import ( "common" "routers" "routers/middleware" )
To zadziała, ponieważ Go spróbuje wyszukać pakiet, zaczynając od katalogu dostawcy projektu (jeśli ma co najmniej jeden plik .go) zamiast $ GOPATH / src.
Do Twojej wiadomości: Możesz zrobić więcej z dostawcą, ponieważ ta funkcja umożliwia umieszczenie „całego kodu zależności” dla pakietu w katalogu własnego projektu, dzięki czemu zawsze będzie mógł uzyskać te same wersje zależności dla wszystkich kompilacji. To jest jak npm lub pip w Pythonie, ale musisz ręcznie skopiować swoje zależności do swojego projektu lub jeśli chcesz to ułatwić, spróbuj wyglądać na govendora Daniela Theophanesa
Aby dowiedzieć się więcej o tej funkcji, spróbuj poszukać tutaj
Zrozumienie i korzystanie z folderu dostawcy autorstwa Daniela Theophanesa
Zrozumienie zarządzania w Go Dependency przez Lucasa Fernandesa da Costa
Mam nadzieję, że Ty lub ktoś inny uzna to za pomocne
źródło
Ścieżki importu są względne w stosunku do zmiennych użytkownika
$GOPATH
i$GOROOT
środowiska. Na przykład z następującymi elementami$GOPATH
:GOPATH=/home/me/go
Paczki znajdujące się w
/home/me/go/src/lib/common
i/home/me/go/src/lib/routers
są importowane odpowiednio jako:import ( "lib/common" "lib/routers" )
źródło
go install
pakietów, które używają importu względnego.$GOPATH/src
.Pakiet lokalny jest denerwującym problemem w podróży.
W przypadku niektórych projektów w naszej firmie decydujemy się w ogóle nie używać pakietów pomocniczych.
$ glide install
$ go get
$ go install
Cała praca.
W przypadku niektórych projektów używamy pakietów podrzędnych i importujemy pakiety lokalne z pełną ścieżką:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Ale jeśli rozwidlimy ten projekt, wówczas podpakiety nadal odnoszą się do oryginalnego.
źródło