我对Golang目录结构感到困惑。
根据名为< The way to go>的书,项目代码应放在src
中,并推荐以下目录结构。
├──src/
| ├──main.go
| ├──say/
| | ├──say.go
| | ├──say_test.go
├──bin/
| ├──say
└──pkg/
└──linux_amd64/
└──say.a
但我发现github.com
中的许多软件包都没有src
目录。
例如:
https://github.com/facebookgo/grace
https://github.com/astaxie/beego
所以,我不知道是否需要src
目录。
我有一些项目,他们有相互依赖。 它们在私有GitLab存储库中管理。
我如何组织它们?
答案 0 :(得分:10)
This文章引导了我。
从这样的事情开始一般都很好(假设你在$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
| ├── ...
有时它取决于您的需求。在我们的工作流程中,我们使用名为fresh的热代码重新加载工具,因此我们需要将main.go
放在项目根目录上,以便该工具可以检测所有文件更改并重建源代码。
├──app/
| ├──app.go
├──model/ --
| ├──model.go
├──store
| ├──store.go
├──main.go -- this is where the app starts
├──...
在app.go
包中,我有类似func Run() error
的内容启动应用程序。在main.go
上,我只是调用函数:
...
func main(){
log.Fatal(app.Run())
}
答案 1 :(得分:2)
现在有new way组织golang项目。 进入golang-standards的github,据说:
这是Go应用程序项目的基本布局。它代表了 最常见的目录结构有许多小的增强功能 以及任何现实世界共有的几个支持目录 应用
这个项目布局是故意通用的,并没有尝试 强加一个特定的Go包结构。
或者您可以按照slides:
进行操作$GOPATH/
src/
github.com/user/repo/
mypkg/
mysrc1.go
mysrc2.go
cmd/mycmd/
main.go
bin/
mycmd
答案 2 :(得分:1)
本书描述了结账后的目录结构。如果该书包含.git目录,那将会很有帮助。
$ GOPATH / src是导入工作所必需的。
├──src/
| ├──.git
| | ├──...
| ├──main.go
| ├──say/
| | ├──say.go
| | ├──say_test.go
├──bin/
| ├──say
└──pkg/
└──linux_amd64/
└──say.a
实际上,main.go实际上位于反映远程git存储库的路径中,例如
.
├── bin
│ └── say
├── pkg
│ └── linux_amd64
│ └── github.com
│ └── pschultz
│ └── hello-world
│ └── say.a
└── src
└── github.com
└── pschultz
└── hello-world
├── .git
│ └── ...
├── main.go
└── say
├── say.go
└── say_test.go
答案 3 :(得分:0)
这是另一个项目布局示例 Simple Go project layout with modules
├── LICENSE
├── README.md
├── config.go
├── go.mod
├── go.sum
├── clientlib
│ ├── lib.go
│ └── lib_test.go
├── cmd
│ ├── modlib-client
│ │ └── main.go
│ └── modlib-server
│ └── main.go
├── internal
│ └── auth
│ ├── auth.go
│ └── auth_test.go
└── serverlib
└── lib.go
有些答案指出了 go standard layout,然而,Russ Cox 有一个问题 this is not a standard Go project layout
<块引用>这个 GitHub 存储库有两个问题:
<块引用>关于“为什么不告诉我们标准的 Go 项目布局,我们将更新文档?”,这仅解决了第 2 点。如果真的有标准,它们将在主要的 Go 项目文档树中。项目布局的标准也会短很多。我感谢您尝试提供有用的资源,但称其为“golang-standards”的要求更高。
<块引用>但为了记录,可导入 Go 存储库的最小标准布局实际上是:
<块引用>就是这样。这就是“标准”。
答案 4 :(得分:-1)
不需要src目录,事实上很多公共存储库都不使用这种结构。
组织项目有几种不同的方式。如果您计划让其他存储库(如lib)使用您的项目。我建议使用像这样的cmd结构。如果有多种方法可以启动应用程序,这也是推荐的方法。 (multipliable main.go文件)
├──cmd/
| ├──(application name)
| | ├──main.go
└──say/
├──say.go
└──say_test.go
否则,例如,如果它是独立的应用程序。您可以将main.go放在存储库的根目录中。
bin和pkg你可以保留在root中并将其添加到.gitignore。 (假设你正在使用git)