Я новичок и работаю над примером кода, который хочу локализовать.
В исходном main.go
заявлении импорта это было:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Теперь у меня есть common
и routers
пакет в/home/me/go/src/myapp
Поэтому я преобразовал оператор импорта в:
import (
"log"
"net/http"
"./common"
"./routers"
)
Но когда я бегу, go install myapp
я получаю следующие ошибки:
can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package
Кроме того, когда я использую common
и routers
вместо ./common
и ./routers
в операторе импорта, я получаю:
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)
Как я могу это исправить?
Ответы:
Что ж, с проблемой разобрался. Обычно начальный путь Go для импорта
$HOME/go/src
Поэтому мне просто нужно было добавить
myapp
перед именами пакетов, то есть импорт должен быть:import ( "log" "net/http" "myapp/common" "myapp/routers" )
источник
myapp
- плохая идея, например, если вы измените имя проекта, весь импорт будет неудачнымgo mod init <module_name>
а потом простоimport "<module_name>/<pkg_name>"
.Если вы используете Go 1.5, описанный выше, вы можете попробовать использовать функцию продажи . Это позволяет вам поместить локальный пакет в папку поставщика и импортировать его с более коротким путем. В вашем случае вы можете поместить свою общую папку и папку маршрутизаторов в папку поставщика, чтобы это было похоже на
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
и импортируйте его вот так
import ( "common" "routers" "routers/middleware" )
Это будет работать, потому что Go попытается найти ваш пакет, начиная с каталога vendor вашего проекта (если он имеет хотя бы один файл .go) вместо $ GOPATH / src.
К вашему сведению: вы можете сделать больше с поставщиком, потому что эта функция позволяет вам поместить «весь код вашей зависимости» для пакета в каталог вашего собственного проекта, чтобы он всегда мог получать одни и те же версии зависимостей для всех сборок. Это похоже на npm или pip в python, но вам нужно вручную скопировать свои зависимости в свой проект, или, если вы хотите упростить это, попробуйте поискать губернатора Даниэля Феофана
Чтобы узнать больше об этой функции, попробуйте найти здесь
Понимание и использование папки поставщика, Даниэль Феофанес
Понимание управления зависимостями в Go, Лукас Фернандес да Коста
Я надеюсь, что вы или кто-то другой найдете это полезным
источник
Пути импорта относятся к вашим переменным
$GOPATH
и$GOROOT
переменным среды. Например, со следующим$GOPATH
:GOPATH=/home/me/go
Пакеты, расположенные в
/home/me/go/src/lib/common
и/home/me/go/src/lib/routers
импортируются соответственно как:import ( "lib/common" "lib/routers" )
источник
go install
пакеты, использующие относительный импорт.$GOPATH/src
.Локальный пакет - досадная проблема на ходу.
Для некоторых проектов в нашей компании мы решаем вообще не использовать подпакеты.
$ glide install
$ go get
$ go install
Все работает.
Для некоторых проектов мы используем подпакеты и импортируем локальные пакеты с полным путем:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Но если мы форкнем этот проект, то подпакеты все равно будут ссылаться на исходный.
источник