2016-02-18 4 views
17

Я новичок, чтобы пойти и работать над примером кода, который я хочу локализовать.Как импортировать локальные пакеты в 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 (
    "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) 

Как я могу это исправить?

+2

Все импорт «локальный», независимо от пути импорта. См. [«Как написать код перехода»] (https://golang.org/doc/code.html) для подробного объяснения. – JimB

+1

@JimB отложив в сторону философские дебаты, я обеспокоен тем, как решить проблему, упомянутую выше. – Karlom

+1

Я не пытаюсь сделать философское утверждение, я буквально говорю * все * импорт происходит в вашей локальной файловой системе; нет никакой разницы, происходят ли они из удаленного репо или нет. Не пытайтесь использовать относительные пути (они работают иногда, но не рекомендуется), и перейдите к документу «Как писать код», в частности раздел [Организация кода]] (https://golang.org/ док/code.html # Organization). – JimB

ответ

15

Ну, я понял, проблема. основном Перейти начальный путь для импорта $HOME/go/src

Так что я просто нужно добавить myapp перед именами пакетов, то есть импорт должен быть:

import (
    "log" 
    "net/http" 
    "myapp/common" 
    "myapp/routers" 
) 
7

Пути импорта относительно ваших переменных окружения $GOPATH и $GOROOT. Например, с помощью следующих $GOPATH:

GOPATH=/home/me/go 

пакетов, расположенных в /home/me/go/src/lib/common и /home/me/go/src/lib/routers импортируются, соответственно, как:

import (
    "lib/common" 
    "lib/routers" 
) 
+0

Да, первым примером была моя ошибка. – wlredeye

+0

Что вы подразумеваете под относительным путем, не поддерживаемым инструментами? – wlredeye

+0

Вы не можете 'идти устанавливать пакеты, которые используют относительный импорт. – JimB

6

Если вы используете Go 1.5 выше, вы можете попробовать использовать продавец. Позволяет разместить локальный пакет под продавцом и импортировать его с более коротким путем. В вашем случае, вы можете положить ваши общих и маршрутизаторов папки внутри поставщика папки поэтому было бы как

myapp/ 
--vendor/ 
----common/ 
----routers/ 
------middleware/ 
--main.go 

и импортировать его как этот

import (
    "common" 
    "routers" 
    "routers/middleware" 
) 

Это будет работать потому что Go попытается найти ваш пакет, начиная с каталога поставщика вашего проекта (если он имеет хотя бы один файл .go) вместо $ GOPATH/src.

FYI: вы можете делать больше с продавцом, поскольку эта функция позволяет вам поставить «весь код вашей зависимостей» для пакета внутри каталога вашего собственного проекта, чтобы он мог всегда получать одинаковые версии зависимостей для всех сборок.Это похоже на npm или pip на python, но вам нужно вручную скопировать ваши зависимости на ваш проект или, если вы хотите сделать это легко, попробуйте посмотреть голубь Даниэля Феофана

Чтобы узнать об этой функции, попробуйте посмотреть здесь

Understanding and Using Vendor Folder by Daniel Theophanes

Understanding Go Dependency Management by Lucas Fernandes da Costa

Я надеюсь, что вы или кто-то еще найти его услужливо

Смежные вопросы