Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error with Go modules build using /cmd structure

Tags:

go

go-modules

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?

like image 869
ragurney Avatar asked Nov 02 '18 16:11

ragurney


People also ask

What is Go build command?

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.

How do I install modules in Go?

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.

Is Gopath still needed?

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.


1 Answers

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.

like image 144
George Edward Shaw IV Avatar answered Oct 06 '22 11:10

George Edward Shaw IV