Как импортировать локальные пакеты в go?
Я новичок в работе над примером кода, который я хочу локализовать.
В оригинальной main.go
импорт 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 в:
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
в инструкции import, я получаю:
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)
Как я могу это исправить?
Ответы
Ответ 1
Ну, я понял проблему. В основном путь запуска для импорта - $HOME/go/src
Поэтому мне просто нужно было добавить myapp
перед именами пакетов, то есть импорт должен быть:
import (
"log"
"net/http"
"myapp/common"
"myapp/routers"
)
Ответ 2
Если вы используете Go 1.5 выше, вы можете попробовать использовать функцию поставщика. Он позволяет разместить локальный пакет под папкой поставщика и импортировать его с более коротким путем. В вашем случае вы можете разместить свою общую папку и папку с маршрутизаторами внутри папки поставщика, чтобы это было похоже на
myapp/
--vendor/
----common/
----routers/
------middleware/
--main.go
и импортировать его так
import (
"common"
"routers"
"routers/middleware"
)
Это будет работать, потому что Go попытается найти ваш пакет, начиная с каталога вашего поставщика проектов (если он имеет хотя бы один файл.go) вместо $ GOPATH/src.
FYI: вы можете делать больше с продавцом, потому что эта функция позволяет вам поставить "весь ваш код зависимостей" для пакета внутри вашего собственного каталога проектов, чтобы он всегда мог получать одинаковые версии зависимостей для всех сборок. Это похоже на npm или pip в python, но вам нужно вручную скопировать ваши зависимости к вашему проекту или, если вы хотите сделать это легко, попробуйте посмотреть говень Даниэля Феофана
Чтобы узнать об этой функции, попробуйте найти здесь
Понимание и использование папки поставщика Daniel Theophanes
Понимание управления зависимостями Go от Lucas Fernandes da Costa
Я надеюсь, что вы или кто-то другой найдет это полезным
Ответ 3
Пути импорта относятся к вашим переменным среды $GOPATH
и $GOROOT
. Например, со следующими $GOPATH
:
GOPATH=/home/me/go
Пакеты, расположенные в /home/me/go/src/lib/common
и /home/me/go/src/lib/routers
, импортируются соответственно как:
import (
"lib/common"
"lib/routers"
)
Ответ 4
Локальный пакет - это раздражающая проблема в go.
Для некоторых проектов в нашей компании мы вообще не решаем использовать подпакеты. glide install
go get/install
все работает.
Для некоторых проектов мы используем import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
и импортируем локальные пакеты с полным путем: import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
glide install
go get/install
all works. Но если мы развиваем этот проект, то подпакеты все еще ссылаются оригинальный.