Ошибка при сборке модулей 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 с модулями?


person ragurney    schedule 02.11.2018    source источник
comment
Какая строка module в вашем go.mod? Похоже, это относится к cmd/app_name, что было бы неверно - он должен указывать на каталог, в котором он расположен.   -  person Adrian    schedule 02.11.2018
comment
Он конкретно указывал на cmd/app_name: module github.com/ragurney/app_name/cmd/app_name. Вместо этого должно быть: github.com/ragurney/app_name? Это вызывает аналогичную ошибку: не удается найти модуль, предоставляющий пакет github.com/ragurney/app_name   -  person ragurney    schedule 02.11.2018
comment
Да, это должно быть github.com/ragurney/app_name, если это корень (где находится файл go.mod). У вас случайно есть несколько go.mod файлов в репо?   -  person Adrian    schedule 02.11.2018


Ответы (2)


Чтобы ответить на ваш первый вопрос, он полностью самоуверен, и все, что вам нравится больше всего, также легко понять другим, с которым вы должны идти (я думаю, это нормально).

Чтобы ответить на ваш второй вопрос, причина, по которой go build ./... работает в отличие от go build из корневого каталога, заключается в том, что ./... запускается в текущем каталоге (корне), ищет все точки входа программы и строит их. Когда вы перемещаете main.go в корневой каталог, с этой новой информацией, go build работа имеет смысл, так как он ищет только в текущем каталоге.

Вы можете явно указать go build ./cmd/app_name, что также подойдет.

Структура вашего приложения отлично работает с модулями, так как я использую что-то очень похожее на нее (https://www.ardanlabs.com/blog/2017/02/package-oriated-design.html), и у меня очень хорошо работают модули.

person George Edward Shaw IV    schedule 02.11.2018
comment
Спасибо за подробный ответ, а также за ссылку, очень полезный ресурс! Просто для подтверждения, нормально, если я сохраню эту структуру, а затем инициализирую с помощью go mod init github.com/ragurney/app_name? Затем, когда я захочу сгенерировать двоичный файл, запустите go build cmd/app_name/main.go? - person ragurney; 02.11.2018
comment
Да, это совершенно верно! - person George Edward Shaw IV; 02.11.2018
comment
Как сказано в ответе, вы бы go build ./cmd/app_name. Вы создаете пакет, а не файл, и важно внедрить его в CWD (в противном случае вы думаете, что вы указываете имя пакета, а не путь). - person Adrian; 02.11.2018
comment
Попался, спасибо всем за помощь и за то, что терпели мои глупые вопросы. Узнал сегодня кое-что новое: D - person ragurney; 02.11.2018
comment
... важно укоренить его в CWD ... @Adrian, не могли бы вы указать мне ссылку, которая описывает это / подробнее? Я сделал go mod init github.com/ragurney/app_name, который, кажется, работает нормально, хотя мой cwd похож на /Users/rygurney/Code/OtherDir/app_name - person ragurney; 02.11.2018
comment
go help build объяснил бы, о чем я говорил в своем комментарии, но это не имеет ничего общего с модулями, это просто то, как работает команда сборки. - person Adrian; 02.11.2018

насколько я могу судить, в структуре вашего проекта все в порядке. Что сработало для меня, так это запустить команду go build / run из корня проекта

eg. go run github.com/username/project/cmd/somecommand

go build -o somebinary github.com/username/project/cmd/somecommand

person kignwill101    schedule 02.11.2018