Search code examples
gogo-modules

Error with Go modules build using /cmd structure


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
  1. Is this idiomatically correct? I know there's not a whole lot of consensus out there, but I'd like to follow best practices.
  2. When I run 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?


Solution

  • 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.