使用 /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
- 这在惯用语上是否正确?我知道目前还没有达成很多共识,但我想遵循最佳做法。
- 当我 运行
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
我是模块的新手,我正在一个新项目中试用它们,我试图按照描述的结构建模 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
- 这在惯用语上是否正确?我知道目前还没有达成很多共识,但我想遵循最佳做法。
- 当我 运行
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