Golang项目目录结构

时间:2017-10-09 12:32:45

标签: go gopath

我对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存储库中管理。

我如何组织它们?

5 个答案:

答案 0 :(得分:10)

当我开始使用Go时, Ben Johnson

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
|  ├── ...

对于此类项目结构,您可以查看this中的go-kit示例。

有时它取决于您的需求。在我们的工作流程中,我们使用名为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 标准,但实际上并没有,因为这些绝不是官方标准
  • 它提出的项目布局标准太复杂,不是标准
<块引用>

关于“为什么不告诉我们标准的 Go 项目布局,我们将更新文档?”,这仅解决了第 2 点。如果真的有标准,它们将在主要的 Go 项目文档树中。项目布局的标准也会短很多。我感谢您尝试提供有用的资源,但称其为“golang-standards”的要求更高。

<块引用>

但为了记录,可导入 Go 存储库的最小标准布局实际上是:

<块引用>
  • 在你的根目录中放入一个 LICENSE 文件
  • 在你的根目录中放入一个 go.mod 文件
  • 将 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)