2015-10-26 3 views
5

Я пытаюсь понять, как организовать код go, используя «внутренние» пакеты. Позвольте мне показать, что структура у меня есть:Как использовать «внутренние» пакеты?

project/ 
    internal/ 
    foo/ 
     foo.go # package foo 
    bar/ 
     bar.go # package bar 
    main.go 

# here is the code from main.go 
package main 

import (
    "project/internal/foo" 
    "project/internal/bar" 
) 

project/ находится вне от GOPATH дерева. Независимо от пути, который я пытаюсь импортировать из main.go, ничего не работает, единственный случай, который работает, - import "./internal/foo|bar". Я думаю, что я делаю что-то неправильно или вообще ошибаюсь в «внутренней» идее пакета. Может, кто-нибудь прояснит ситуацию, пожалуйста?

UPDATE

В приведенном выше примере правильно только то, что мне нужно было поместить project/ папку под $GOPATH/src. Так что путь импорта, как project/internal/foo|bar, является работоспособным, если мы импортируем его только из поддерева project/, а не извне.

+5

Вы не можете импортировать пакеты, которые не в '$ GOPATH/src'. Попробуйте создать пакет 'project/baz', вы также не сможете его импортировать. Поместите все свои проекты в GOPATH. –

+0

Что делать, если я не хочу размещать каждый проект под GOPATH? –

+2

Вот как работают инструменты go. Если вы хотите использовать пакет, он должен находиться под GOPATH. – JimB

ответ

6

Пакеты должны быть размещены в вашем $GOPATH для импорта. Пример, который вы указали с помощью import "./internal/foo|bar", работает, потому что он выполняет локальный импорт. internal только делает его таким кодом, который не имеет общего корневого каталога, в ваш каталог internal не может импортировать пакеты в пределах internal.

Если поместить все это в вашем gopath затем пытался импортировать из другого места, как OuterFolder/project2/main.go где OuterFolder содержит как projectproject2 и затем import "../../project/internal/foo" потерпит неудачу. Оно также потерпит неудачу как import "foo" или любым другим способом, который вы попробовали из-за того, что не удовлетворяете этому условию;

Импорт из пути, содержащий элемент «внутренний» отвергается, если импортирующий код вне дерева на родителе «внутреннего» каталог .

Теперь, если у вас путь $GOPATH/src/project, то вы могли бы сделать import "foo" и import "bar" изнутри $GOPATH/src/project/main.go и импорт будет успешным. Вещи, которые не содержатся под project, однако не смогут импортировать foo или bar.

0

ниже способ является более масштабируемым, особенно если вы планируете построить несколько двоичных файлов

github.com/servi-io/api 
├── cmd/ 
│ ├── servi/ 
│ │ ├── cmdupdate/ 
│ │ ├── cmdquery/ 
│ │ └── main.go 
│ └── servid/ 
│  ├── routes/ 
│  │ └── handlers/ 
│  ├── tests/ 
│  └── main.go 
├── internal/ 
│ ├── attachments/ 
│ ├── locations/ 
│ ├── orders/ 
│ │ ├── customers/ 
│ │ ├── items/ 
│ │ ├── tags/ 
│ │ └── orders.go 
│ ├── registrations/ 
│ └── platform/ 
│  ├── crypto/ 
│  ├── mongo/ 
│  └── json/ 

for more

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