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?
go build command is generally used to compile the packages and dependencies that you have defined/used in your project. So how go build is executing internally, what compiler executes, which directories created or deleted; Those all questions are answered by go build command flags.
To do this, you'll use the go tool's mod init command and provide it with the module's name, which in this case is mymodule . Now create the module by running go mod init from the mymodule directory and provide it with the module's name, mymodule : go mod init mymodule.
Since 1.12 version Go modules is enabled by default and the GOPATH will be deprecated in 1.13 version. For those who are getting started with Go 1.12, the installation and set up goes will be as follows.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With