Как импортировать локальные пакеты в 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. Но если мы развиваем этот проект, то подпакеты все еще ссылаются оригинальный.