Структурирование многопользовательского проекта Go
Я пытаюсь построить проект архитектуры микро-сервисов в Go. В настоящее время я использую Go 1.11, который поддерживает модули, поэтому я помещаю свой корневой каталог в произвольно выбранный каталог за пределами GOPATH
,
Если я правильно понимаю концепцию архитектуры микросервисов, хотя мои микросервисы должны быть независимыми, они могут иметь общие зависимости (и я не вижу другого способа сделать что-то, не так ли?)
Ниже моя структура каталогов:
.
├── go.mod
├── lambda
│ └── account_create
│ └── main.go
├── readme.md
└── types
├── account.go
├── location.go
├── order.go
├── pricing.go
├── product.go
└── types.go
Теперь поведение, которое я ожидал, должно было быть в состоянии запустить go build lambda/account_create
и получить исполняемый файл с этой функциональностью, чтобы я мог предоставить его соответствующей функции AWS Lambda.
Однако когда я запускаю команду, я получаю:
can't load package: package lambda/account_create: unknown import path "lambda/account_create": cannot find module providing package lambda/account_create
Пожалуйста, объясните мне, почему это не работает, и дайте мне несколько советов о том, как должен выглядеть такой проект.
Большое спасибо!
Редактировать вот мой lambda/account_create/main.go
содержимое файла:
package account_create
import (
"fmt"
"roasted.ro/pkg/types"
)
func main() {
account := types.UserAccount{Name: "Victor"}
fmt.Printf("Welcome %s", account.Name)
}
1 ответ
Чтобы ответить на последнюю часть вашего вопроса (поскольку первая половина больше касается предпочтений), вам нужно сделать:
go build ./lambda/account_create
Обратите внимание на ./
, go build
принимает имя пакета или путь. Если вы не начинаете путь с ./
, предполагается, что вы даете ему имя пакета.
Изменить: пакет должен быть main
если вы хотите исполняемый файл. Согласно документам, вы всегда должны использовать package main
для проектов, которые создают исполняемый файл:
Исполняемые команды должны всегда использовать
package main
,
Изменить: Я добавлю некоторые мнения о макете:
Подумайте, какие части вашего проекта экспортируются в другие проекты go. Это значит, что кто-то может импортировать ваш пакет и ожидать, что он получит ценность, и не потеряет свой код при изменении вашего пакета.
Это должно быть либо в github.com/you/pkg/somepath
пакет или просто github.com/you/somepath
,
Все остальное (кроме основных пакетов) должно быть под /internal
пакет.
Я обычно делаю /cmd/myexecurable1
/cmd/myexecurable2
и так далее для каждого исполняемого файла.