关于Golang目录结构,我有些困惑.
根据名为<The way to go>的书,项目代码应放入src,并推荐以下目录结构.
???src/
| ???main.go
| ???say/
| | ???say.go
| | ???say_test.go
???bin/
| ???say
???pkg/
???linux_amd64/
???say.a
Run Code Online (Sandbox Code Playgroud)
但我发现很多包里面github.com都没有src目录.
例如:
https://github.com/facebookgo/grace
https://github.com/astaxie/beego
所以,我不知道是否src需要目录.
我有一些项目,他们有相互依赖.它们在私有GitLab存储库中管理.
我怎么组织他们?
Ste*_*rer 11
当我开始使用Go时,Ben Johnson的这篇文章引导了我.
从这样的事情开始通常是好的(假设你在项目目录中,如$GOPATH/src/myproject:
???cmd/ -- this is where you compose several packages in to main package
| ???foo -- an example would be `foo`
| | ???main.go
???pkg/ -- this is where put your reusable packages
| ???pkg1 -- reusable package 1
| ???pkg2 -- reusable package 2
???otherpackage1
| ??? ...
???otherpackage2
| ??? ...
Run Code Online (Sandbox Code Playgroud)
有时它取决于您的需求.在我们的工作流程中,我们使用名为fresh的热代码重新加载工具,因此我们需要将main.go项目置于根目录上,以便该工具可以检测所有文件更改并重建源代码.
???app/
| ???app.go
???model/ --
| ???model.go
???store
| ???store.go
???main.go -- this is where the app starts
???...
Run Code Online (Sandbox Code Playgroud)
在app.go包上,我有类似的东西func Run() error启动应用程序.在main.go,我只是调用函数:
...
func main(){
log.Fatal(app.Run())
}
Run Code Online (Sandbox Code Playgroud)
zan*_*ngw 10
更新于 2023 年 11 月 23 日
\ngo.dev 上《组织 Go 模块》的摘要
\n\n\n刚接触 Go 的开发人员的一个常见问题是 \xe2\x80\x9c 如何组织我的 Go 项目?\xe2\x80\x9d,就文件和文件夹的布局而言。本文档的目的是提供一些指南来帮助回答这个问题。
\n
project-root-directory/\n go.mod\n modname.go\n modname_test.go\nRun Code Online (Sandbox Code Playgroud)\nfunc main。较大的程序可以将其代码拆分为多个文件,所有文件都声明package main:project-root-directory/\n go.mod\n auth.go\n auth_test.go\n client.go\n main.go\nRun Code Online (Sandbox Code Playgroud)\nproject-root-directory/\n internal/\n auth/\n auth.go\n auth_test.go\n hash/\n hash.go\n hash_test.go\n go.mod\n modname.go\n modname_test.go\nRun Code Online (Sandbox Code Playgroud)\nproject-root-directory/\n go.mod\n modname.go\n modname_test.go\n auth/\n auth.go\n auth_test.go\n token/\n token.go\n token_test.go\n hash/\n hash.go\n internal/\n trace/\n trace.go\nRun Code Online (Sandbox Code Playgroud)\nproject-root-directory/\n go.mod\n internal/\n ... shared internal packages\n prog1/\n main.go\n prog2/\n main.go\nRun Code Online (Sandbox Code Playgroud)\nproject-root-directory/\n go.mod\n modname.go\n modname_test.go\n auth/\n auth.go\n auth_test.go\n internal/\n ... internal packages\n cmd/\n prog1/\n main.go\n prog2/\n main.go\nRun Code Online (Sandbox Code Playgroud)\nproject-root-directory/\n go.mod\n internal/\n auth/\n ...\n metrics/\n ...\n model/\n ...\n cmd/\n api-server/\n main.go\n metrics-analyzer/\n main.go\n ...\n ... the project\'s other directories with non-Go code\nRun Code Online (Sandbox Code Playgroud)\n这是另一个项目布局示例带有模块的简单 Go 项目布局
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.sum\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 clientlib\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib_test.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmd\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 modlib-client\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modlib-server\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 internal\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 auth\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 auth.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 auth_test.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 serverlib\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.go\nRun Code Online (Sandbox Code Playgroud)\n一些答案指出了go 标准布局,但是,有一个问题,这不是标准的 Go 项目布局Russ Cox 的标准 Go 项目布局
\n\n\n这个 GitHub 存储库有两个问题:
\n
\n\n\n
\n- 它声称拥有 Go 标准,但实际上并没有,因为这些绝不是官方标准
\n- 它提出的项目布局标准过于复杂,不是一个标准
\n
\n\n关于“为什么不告诉我们标准的 Go 项目布局,我们将更新文档?”,这只解决了第 2 点。如果有标准,标准将位于主 Go 项目文档树中。项目布局的标准也会短得多。我很感激您尝试提供有用的资源,但称其为“golang-standards”是夸大其词。
\n
\n\n但郑重声明,可导入 Go 存储库的最小标准布局实际上是:
\n
\n\n\n
\n- 将 LICENSE 文件放入您的根目录中
\n- 将 go.mod 文件放入根目录中
\n- 将 Go 代码放入您的存储库、根目录中或按照您认为合适的方式组织到目录树中
\n
\n\n就是这样。这就是“标准”。
\n
更新于 11/30/2021
\n这是来自的摘要这是《如何构建 Go 代码》
\ndoc.go文件放置了包的一般描述Readme提交该项目的总体概述docs文件夹中courses/\n main.go\n server.go\n user_profile.go\n lesson.go\n course.go\nRun Code Online (Sandbox Code Playgroud)\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 handlers\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 course.go\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lecture.go\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 profile.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 user.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 course.go\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lecture.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 user.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 repositories\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 course.go\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lecture.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 user.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 services\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 course.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 user.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 utils\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 stings.go\nRun Code Online (Sandbox Code Playgroud)\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 course\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 httphandler.go\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model.go\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 repository.go\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 service.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 profile\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 httphandler.go\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model.go\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 repository.go\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 service.go\nRun Code Online (Sandbox Code Playgroud)\n现在有组织 golang 项目的新方法。进入golang-standards的 github ,有说:
这是 Go 应用程序项目的基本布局。它代表了最常见的目录结构,具有许多小的增强功能以及任何现实世界应用程序共有的几个支持目录。
这个项目布局是故意通用的,它不会试图强加特定的 Go 包结构。
或者您可以按照此幻灯片进行操作:
$GOPATH/
src/
github.com/user/repo/
mypkg/
mysrc1.go
mysrc2.go
cmd/mycmd/
main.go
bin/
mycmd
Run Code Online (Sandbox Code Playgroud)
src 目录是不需要的,事实上很多公共存储库不使用这种结构。
\n\n有几种不同的方式来组织您的项目。如果您计划让其他存储库(例如 lib.lib)使用您的项目。我建议使用类似这样的 cmd 结构。如果启动应用程序的方法不止一种,这也将是推荐的方法。(多个main.go文件)
\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80cmd/\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80(application name)\n| | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80main.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80say/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80say.go\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80say_test.go\nRun Code Online (Sandbox Code Playgroud)\n\n否则,例如如果它是一个独立的应用程序。您可以将 main.go 放在存储库的根目录中。
\n\nbin 和 pkg 您可以保留在根目录中并将其添加到 .gitignore 中。(假设你正在使用git)
\n