使用 /cmd 结构构建 Go 模块时出错

Error with Go modules build using /cmd structure

我是模块的新手,我正在一个新项目中试用它们,我试图按照描述的结构建模 here

这是我的目录结构的示例:

.
├── 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 我得到 'unexpected module path "github.com/ragurney/app_name/cmd/app_name"',但是当我 运行 go build ./... 它有效。为什么?

当我将 main.go 移动到顶层时,一切都按预期进行。我应该不对模块使用 /cmd 模式吗?

回答你的第一个问题,它完全是自以为是,无论你最喜欢什么,对于其他人来说也很容易理解,你应该接受(我认为这很好)。

要回答你的第二个问题,go build ./... 与根目录中的 go build 相反的原因是因为 ./... 从当前目录(根目录)开始并搜索所有程序入口点并构建它们。当您将 main.go 移动到根目录时,有了这个新信息,go build 工作就有意义了,因为它只在当前目录中查找。

你可以明确地说 go build ./cmd/app_name 也可以。

您的应用程序结构与模块配合得很好,因为我使用的东西与它非常相似 (https://www.ardanlabs.com/blog/2017/02/package-oriented-design.html),而且模块对我来说工作得很好。

据我所知,您的项目结构没有任何问题。对我有用的是 运行 来自项目根

的 go build/run 命令

例如。 go run github.com/username/project/cmd/somecommand

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