Ошибка при сборке модулей 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
  1. Это идиоматически правильно? Я знаю, что там не так много консенсуса, но я бы хотел следовать лучшим практикам.
  2. Когда я бегу 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

Другие вопросы по тегам