Golang 存储库的正确结构

问题描述 投票:0回答:2

我开始从事 Golang 开发。现在我的老板给了我其他开发人员制作的项目的存储库,现在他离开了公司,我无法问他一些与此相关的事情。现在我对他推送到仓库的项目结构感到困惑,结构是下一个:

 |-MyApp
 |--bin
 |--pkg
 |--src
 |----api (the code of the app)
 |----github.com
 |----golang.org
 |----gopkg.in

对我来说,它是精确的 Go 结构,1.- 仓库中不应该只有 api 文件夹? 如果我进入 api 文件夹并执行

go run main.go
,我会收到一条消息,指出某些包即使在该文件夹中也找不到,2.-如何在 go run 命令中指定包?

3.- 为 golang 项目设置这种结构是一个好的做法吗?我在代码中看到他仅使用“package1”导出包,如果我将应用程序的代码复制并粘贴到golang工作区中,那么我必须指定导出包的文件夹的名称,例如:“myApp/ package1”所以我有这个疑问。谢谢你

go repository
2个回答
2
投票

这一切都取决于。没有万事皆有唯一正确的方法。

这个存储库似乎决定提供所有内容,整个 GOPATH。这没关系,但如果使用“现代”

vendor
文件夹,今天的做法可能会有所不同。

永远不要这样做

go run
。这仅适用于玩具程序。使用
go build
go install
构建您的软件。这些命令适用于包路径。

对于其他一切:请参阅官方文档https://golang.org/doc/code.html并坚持下去(这意味着你应该稍微移动一些东西)。


0
投票

为什么找不到包 当您在 api 文件夹内运行 go run main.go 时,Go 无法解析导入,因为该项目未使用 Go 模块正确设置。

该做什么:

检查根目录中是否有 go.mod 文件。如果不存在,则需要初始化模块:

bash 复制 编辑 go mod 初始化 myapp 将 myapp 替换为您的模块名称。

确保 go.mod 文件中正确列出了依赖项。如果没有,请运行:

bash 复制 编辑 保持整洁 修复代码中的导入路径:

如果 api 文件夹是项目的根目录,则导入应使用模块名称(例如 myapp/package1)。

在 go run 中指定包 要运行您的应用程序,请在模块根目录(go.mod 所在的位置)使用 go run 命令:

bash 复制 编辑 去运行./api/main.go 如果依赖项丢失或未找到,请确保运行 go mod tidy 来下载并设置它们。

这是一个好的做法吗? 不建议将您描述的结构用于现代 Go 开发。目前 Go 项目的最佳实践是使用带有 Go 模块的扁平且简单的结构。

推荐结构:

CSS 复制 编辑 |-我的应用 |--api/ # 应用代码 |----main.go # 入口点 |----package1/ # 子包 |----package2/ # 子包 |--go.mod # Go 模块文件 |--go.sum # 依赖校验和 要点:

Go 模块:

依赖关系通过 go.mod 和 go.sum 进行管理。 无需在您的存储库中包含 src、github.com、golang.org 或 gopkg.in。 扁平结构:

避免不必要的嵌套(src 或 bin 文件夹对于大多数项目来说都是多余的)。 将代码和依赖项明确分开。 进口:

使用正确的基于模块的导入。例如: 如果您的模块是 myapp,请将包导入为 myapp/package1。 重构项目的步骤 将 api 文件夹移至存储库的根目录:

去 复制 编辑 我的应用程序/ ├── API/ ├── go.mod 初始化模块(如果尚未完成):

bash 复制 编辑 go mod 初始化 myapp 保持整洁 更新代码中的所有导入以使用模块名称:

去 复制 编辑 // 而不是这个: 导入“包1” // 使用: 导入“myapp/package1” 运行应用程序:

bash 复制 编辑 去运行./api/main.go 为什么模块更好 无需手动依赖关系管理:Go 模块自动获取和管理依赖关系。 便携且干净:您的存储库只需要您的代码(api 文件夹)、go.mod 和 go.sum。没有供应商目录或依赖代码。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.