I'm new to go modules, and am taking them for a spin in a new project which I'm trying to model after the structure described here
Here is an example of my directory structure:
.
├── 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
I get 'unexpected module path "github.com/ragurney/app_name/cmd/app_name"', but when I run go build ./...
it works. Why?When I move main.go
to the top level everything works as expected. Should I just not use the /cmd
pattern with modules?
To answer your first question, its completely opinionated and whatever you like best that is also easy to understand for others you should go with (I think it's fine).
To answer your second question the reason go build ./...
works as opposed to go build
from the root directory is because ./...
starts in the current directory (the root) and searches for all program entry-points and builds them. When you move main.go
to the root directory, with this new information, go build
working then makes sense, as its only looking in the current directory.
You can explicitly say go build ./cmd/app_name
which would also work.
Your application structure works perfectly fine with modules, as I use something very similar to it (https://www.ardanlabs.com/blog/2017/02/package-oriented-design.html) and modules work very well for me.