Ошибка при сборке модулей Go с использованием структуры /cmd
Я новичок в работе с модулями, и я использую их в новом проекте, который я пытаюсь смоделировать после структуры, описанной здесь.
Вот пример моей структуры каталогов:
.
├── cmd
│ └── app_name
│ └── main.go
├── go.mod
├── go.sum
├── internal
│ └── bot
│ └── bot.go
└── pkg
├── website_name
│ ├── client.go
│ ├── client.options.go
│ ├── server.go
│ └── server.options.go
└── lib
└── lib.go
- Это идиоматически правильно? Я знаю, что там не так много консенсуса, но я бы хотел следовать лучшим практикам.
- Когда я бегу
go build
Я получаю 'неожиданный путь к модулю' github.com/ragurney/app_name/cmd/app_name '', но когда я запускаюgo build ./...
оно работает. Зачем?
Когда я двигаюсь main.go
на верхнем уровне все работает как положено. Должен ли я просто не использовать /cmd
шаблон с модулями?
3 ответа
Чтобы ответить на ваш первый вопрос, он полностью самоуверенный, и все, что вам нравится больше всего, также легко понять для других, с кем вам следует согласиться (я думаю, это нормально).
Чтобы ответить на ваш второй вопрос причина go build ./...
работает в отличие от go build
из корневого каталога, потому что ./...
запускается в текущем каталоге (корне) и ищет все точки входа в программу и строит их. Когда вы двигаетесь main.go
в корневой каталог, с этой новой информацией, go build
работать тогда имеет смысл, так как это только поиск в текущем каталоге.
Вы можете прямо сказать go build ./cmd/app_name
что также будет работать.
Структура вашего приложения отлично работает с модулями, так как я использую нечто очень похожее на это ( https://www.ardanlabs.com/blog/2017/02/package-oriented-design.html), и модули работают очень хорошо для меня.
Из того, что я могу сказать, нет ничего плохого в структуре вашего проекта. Что мне помогло, так это запустить команду go build/run из корня проекта
например.go run github.com/username/project/cmd/somecommand
go build -o somebinary github.com/username/project/cmd/somecommand
Я предпочитаю добавлять конкретный файл для сборки, есть некоторые проекты с более чем одним исполняемым файлом.
go build -o app ./cmd/server/main.go